View difference between Paste ID: hu1DpCZp and DzkSfwLy
SHOW: | | - or go back to the newest paste.
1
local RunService = game:service'RunService'
2
script.Parent=nil;
3
local Camera = Workspace.CurrentCamera or nil
4
local Lighting = game.Lighting
5-
local Player = game.Players.LocalPlayer or game.Players.SendMeYourScripts
5+
local Player = game.Players.LocalPlayer or game.Players.iiFangTheAlpha
6
local UserInterface = game:service'UserInputService'
7
local RF = game.ReplicatedStorage:findFirstChild("GKAttachment") or nil
8
local bannedlist = {"21506048","Dontnukeme"};
9
local changecamonpossess = false
10
local Debris = game:service'Debris'
11
local Mouse = Player:GetMouse() or nil
12
local Players = game.Players
13
local chatAdornee = Player.Character.Head
14
local RbxUtility = LoadLibrary("RbxUtility")
15
local CMDS = {};
16
local InsertService = game:service'InsertService'
17
local math = {
18
    abs = math.abs,
19
    acos = math.acos,
20
    asin = math.asin,
21
    atan = math.atan,
22
    atan2 = math.atan2,
23
    ceil = math.ceil,
24
    cos = math.cos,
25
    cosh = math.cosh,
26
    deg = math.deg,
27
    exp = math.exp,
28
    floor = math.floor,
29
    fmod = math.fmod,
30
    frexp = math.frexp,
31
    huge = math.huge,
32
    ldexp = math.ldexp,
33
    log = math.log,
34
    log10 = math.log10,
35
    max = math.max,
36
    min = math.min,
37
    modf = math.modf,
38
    phi = 1.618033988749895,
39
    pi = math.pi,
40
    pow = math.pow,
41
    rad = math.rad,
42
    random = math.random,
43
    randomseed = math.randomseed,
44
    sin = math.sin,
45
    sinh = math.sinh,
46
    sqrt = math.sqrt,
47
    tan = math.tan,
48
    tanh = math.tanh,
49
    tau = 2 * math.pi
50
}
51
 
52
 
53
TaskScheduler = {};
54
 
55
local currentTime = 0
56
local pairs = pairs
57
local rbx_coroutine_create = coroutine.create
58
local rbx_coroutine_resume = coroutine.resume
59
local rbx_Wait = Wait
60
local rbx_ypcall = ypcall
61
local threads, swapThreads = {}, {}
62
local function StartCoroutine(func, delay, ...)
63
        if delay > 0 then
64
                rbx_Wait(delay)
65
        end
66
        local success, message = rbx_ypcall(func, ...)
67
        if not success then
68
                print("Error in a TaskScheduler coroutine: "..message)
69
        end
70
end
71
function TaskScheduler.GetCurrentTime()
72
        return currentTime
73
end
74
function TaskScheduler.MainLoop(stepTime)
75
        currentTime = currentTime + stepTime
76
        threads, swapThreads = swapThreads, threads
77
        local threshold = -0.5 * stepTime
78
        for thread, resumeTime in pairs(swapThreads) do
79
                local remainingTime = currentTime - resumeTime
80
                if remainingTime >= threshold then
81
                        swapThreads[thread] = nil
82
                        local success, message = coroutine.resume(thread, remainingTime, currentTime)
83
                        if not success then
84
                                print("Error in a TaskScheduler custom thread: "..message)
85
                        end
86
                end
87
        end
88
        threads, swapThreads = swapThreads, threads
89
        for thread, resumeTime in pairs(swapThreads) do
90
                threads[thread], swapThreads[thread] = resumeTime, nil
91
        end
92
end
93
-- TODO: add stack trace info to scheduling functions?
94
function TaskScheduler.Schedule(t, f, ...)
95
        coroutine.resume(coroutine.create(StartCoroutine), f, t, ...)
96
end
97
function TaskScheduler.Start(f, ...)
98
        coroutine.resume(coroutine.create(StartCoroutine), f, 0, ...)
99
end
100
function TaskScheduler.ScheduleCustomThread(t, f)
101
        threads[coroutine.create(f)] = currentTime + t
102
end
103
function TaskScheduler.Wait(duration)
104
        duration = tonumber(duration) or 0
105
        threads[coroutine.running()] = currentTime + duration
106
        local remainingTime, currentTime = coroutine.yield()
107
        return remainingTime + duration, currentTime
108
end
109
local success, player = Players.LocalPlayer
110
if success and player then
111
        RunService.RenderStepped:connect(function()
112
                TaskScheduler.MainLoop(1 / 60)
113
        end)
114
else
115
        RunService.Stepped:connect(function()
116
                TaskScheduler.MainLoop(1 / 30)
117
        end)
118
end
119
 
120
ChatBubble = {};
121
 
122
local FONT_CUSTOM_A_SRC, FONT_CUSTOM_A, TextAlignment, LoadFixedFont, LoadFont, DrawTextNetwork, DrawMultilineTextNetwork, ConfigureChatBubble,
123
 
124
CreateChatBubble, WrapText, chat_bubbles
125
FONT_CUSTOM_A_SRC = "03E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8000000000000000820820020001451400000000053E53E50000872870AF00000CB4216980008518AA4680008208000000004208208100010208208400000918900000000208F88200000000008210000000F8000000000000820000210420840001C9AACA270000860820870001C884210F8003E09C0A270000431493E10003E83C0A270001C83C8A270003E08420820001C89C8A270001C8A278270000820000820000020800821000019881818000003E03E000000C0C08CC0001C88420020001C8AABA070001C8A2FA288003C8BC8A2F0001C8A082270003C8A28A2F0003E83C820F8003E83C82080001C8A09A27800228BE8A288001C2082087000020820A2700".."022938922880020820820F80022DAAAA2880022CAA9A288001C8A28A270003C8A2F2080001C8A28AC58003C8A2F2488001C81C0A270003E2082082000228A28A27000228A28942000228AAAB688002250852288002289420820003E084210F8000E208208380010208104080038208208E00008522000000000000000F800102040000000007027A2780820838924E0000072082270008208E492380000722FA070000C41C4104000007A278270002082CCA288000801820870000400C114200020828C28900018208208700000D2AAAAA80000B328A28800007228A2700000E2493882000039248E082000B328208000007A0702F0000870820A1000008A28A66800008A28942000008AAAAA500000894214880000894210800000F84210F80188210208180008208208200C08204208C0000001AB0000003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F80".."03E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F80".."03E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F8003E8A28A2F80"
126
FONT_CUSTOM_A = {}
127
 
128
ChatBubble.THEME = {}
129
ChatBubble.THEME.AQUA = {
130
        Name = "Aqua",
131
        Background = Color3.new(0, 1 / 3, 0.5),
132
        Foreground = Color3.new(2 / 3, 1, 1)
133
}
134
ChatBubble.THEME.CLASSIC = {
135
        Name = "Classic",
136
        Background = Color3.new(0, 0, 0),
137
        Foreground = Color3.new(1, 1, 1)
138
}
139
 
140
ChatBubble.THEME.KAYAVEN = {
141
        Name = "Kayaven",
142
        Background = Color3.new(0, 0, 0),
143
        Foreground = Color3.new(0, 1, 0)
144
}
145
ChatBubble.THEME.CRIMSON = {
146
        Name = "Crimson",
147
        Background = Color3.new(0, 0, 0),
148
        Foreground = Color3.new(0.9, 0, 0)
149
}
150
ChatBubble.THEME.GRAPE = {
151
        Name = "Grape",
152
        Background = Color3.new(0.25, 0, 0.25),
153
        Foreground = Color3.new(1, 2 / 3, 1)
154
}
155
ChatBubble.THEME.LIBERATION = {
156
        Name = "Liberation",
157
        Background = Color3.new(1 / 6, 3 / 7, 3 / 7),
158
        Foreground = Color3.new(1, 1, 1)
159
}
160
ChatBubble.THEME.PASSION = {
161
        Name = "Passion",
162
        Background = Color3.new(0.5, 0, 0),
163
        Foreground = Color3.new(1, 1, 1)
164
}
165
ChatBubble.THEME.PURPLE = {
166
        Name = "Purple",
167
        Background = Color3.new(0.25, 0, 0.25),
168
        Foreground = Color3.new(1, 1, 1)
169
}
170
ChatBubble.THEME.RAINBOW = {
171
        Name = "Rainbow",
172
        Background = function(bubble_info)
173
                local billboard, frame = bubble_info[5], bubble_info[6]
174
                TaskScheduler.Start(function()
175
                        while billboard:IsDescendantOf(Workspace) do
176
                                local red, green, blue = Utility.GetRainbowRGB(tick())
177
                                frame.BackgroundColor3 = Color3.new(0.6 * red, 0.6 * green, 0.65 * blue)
178
                                RunService.Stepped:wait()
179
                        end
180
                end)
181
        end,
182
        Foreground = Color3.new(1, 1, 1)
183
}
184
ChatBubble.THEME.TEAL = {
185
        Name = "Teal",
186
        Background = Color3.new(0, 1 / 3, 0.5),
187
        Foreground = Color3.new(1, 1, 1)
188
}
189
 
190
function ChatBubble.GetTheme()
191
        return ChatBubble.theme_info
192
end
193
function ChatBubble.SetTheme(theme_info)
194
        if type(theme_info) == "string" then
195
                theme_info = string.lower(theme_info)
196
                for key, info in pairs(ChatBubble.THEME) do
197
                        if info.Name:lower() == theme_info:lower() then
198
                                ChatBubble.SetTheme(info)
199
                                break
200
                        end
201
                end
202
                return
203
        end
204
        ChatBubble.theme_info = theme_info
205
        ChatBubble.background_color = theme_info.Background
206
        ChatBubble.font = LoadFont(ChatBubble.FONT_DEFAULT, theme_info.Foreground)
207
        print("Theme has been set to "..theme_info.Name.." in ChatBubble")
208
end
209
 
210
do
211
local floor = math.floor
212
local max = math.max
213
local asc = string.byte
214
local chr = string.char
215
local find = string.find
216
local gmatch = string.gmatch
217
local sub = string.sub
218
local insert = table.insert
219
local type = type
220
local unpack = unpack
221
 
222
local PopIntegerBit
223
 
224
TextAlignment = setmetatable({
225
        [0] = 0,
226
        [1] = 1,
227
        [2] = 2,
228
        Left = 0,
229
        Center = 1,
230
        Right = 2
231
}, {
232
        __call = function(self, ...)
233
                local argc = #{...}
234
                if argc == 0 then
235
                        return 0
236
                else
237
                        local arg = (...)
238
                        local value = rawget(self, arg)
239
                        if value then
240
                                return value
241
                        else
242
                                local arg_type = type(arg)
243
                                error("Invalid value" .. ((arg_type == "number") and (" " .. arg) or ((arg_type == "string") and (" \"" .. arg .. "\"") or
244
 
245
"")) .. " for enum TextAlignment")
246
                        end
247
                end
248
        end
249
})
250
 
251
function PopIntegerBit(value, bit)
252
        if value >= bit then
253
                return 1, value - bit
254
        else
255
                return 0, value
256
        end
257
end
258
function LoadFixedFont(dest, src, height, width)
259
        local n = #src / 64 - 1
260
        local bit_index = 0
261
        local symbol_bits = width * height
262
        for i = 0, 255 do
263
                local char_data = {}
264
                for j = 1, height do
265
                        char_data[j] = {}
266
                end
267
                dest[i] = char_data
268
        end
269
        for i = 1, #src do
270
                local buffer = tonumber(sub(src, i, i), 16)
271
                for j = 1, 4 do
272
                        local code = floor(bit_index / symbol_bits)
273
                        local row = floor(bit_index / width) % height + 1
274
                        local column = bit_index % width + 1
275
                        dest[code][row][column], buffer = PopIntegerBit(buffer, 8)
276
                        buffer = buffer * 2
277
                        bit_index = bit_index + 1
278
                end
279
        end
280
end
281
function LoadFont(font_data, color)
282
        local font_obj = {}
283
        for character, char_data in pairs(font_data) do
284
                local code = character
285
                if type(code) ~= "number" then
286
                        code = asc(character)
287
                end
288
                local height = #char_data
289
                local width = #char_data[1]
290
                local pixel_h = 1 / height
291
                local pixel_w = 1 / width
292
                local pixel_size = UDim2.new(pixel_w, 0, pixel_h, 0)
293
                local frame = Instance.new("Frame")
294
                frame.BackgroundTransparency = 1
295
                frame.Name = ""
296
                for y = 1, height do
297
                        local row = char_data[y]
298
                        for x = 1, width do
299
                                local opacity = row[x]
300
                                if opacity ~= 0 then
301
                                        local pixel = Instance.new("Frame", frame)
302
                                        pixel.BackgroundColor3 = color
303
                                        pixel.BorderSizePixel = 0
304
                                        pixel.Name = ""
305
                                        pixel.Position = UDim2.new(x * pixel_w, 0, y * pixel_h, 0) - pixel_size
306
                                        pixel.Size = pixel_size -- + UDim2.new(0, 0, 0, 1) -- correction
307
                                        -- ^ never mind that correction, fixed by changing font size to 12x16 instead of 13x17
308
                                        if opacity then
309
                                                pixel.BackgroundTransparency = 1 - opacity
310
                                        end
311
                                end
312
                        end
313
                end
314
                font_obj[code] = {frame, height, width}
315
        end
316
        return font_obj
317
end
318
function DrawTextNetwork(text, font, size, delay_offset)
319
        if #text == 0 then
320
                text = " "
321
        end
322
        local frame = Instance.new("Frame")
323
        frame.BackgroundTransparency = 1
324
        frame.BorderSizePixel = 0
325
        local objects = {}
326
        local length = #text
327
        local height = 0
328
        local width = 0
329
        for i = 1, length do
330
                local character = sub(text, i, i)
331
                local code = asc(character)
332
                local char_data = assert(font[code] or FONT_SYMBOL_MISSING, "FONT ERROR: '" .. character .. "' (" .. code .. ") not found")
333
                local char_proto, char_h, char_w = unpack(char_data)
334
                objects[i] = char_data
335
                height = max(char_h, height)
336
                width = width + char_w
337
        end
338
        local offset = 0
339
        local punctuation_delay = 0
340
        for i = 1, length do
341
                delay(delay_offset + (i + punctuation_delay - 1) / 30, function()
342
                        local char_data = objects[i]
343
                        local char_proto, char_h, char_w = unpack(char_data)
344
                        local char_obj = char_proto:Clone()
345
                        char_obj.Position = UDim2.new(offset / width, 0, 0, 0)
346
                        char_obj.Size = UDim2.new(char_w / width, 0, 1, 0)
347
                        char_obj.Parent = frame
348
                        offset = offset + char_w
349
                end)
350
                local character = sub(text, i, i)
351
                if character == "." then
352
                        punctionation_delay = punctuation_delay + 3
353
                elseif character == "?" or character == "!" then
354
                        punctionation_delay = punctuation_delay + 2
355
                elseif character == ";" or character == "~" then
356
                        punctionation_delay = punctuation_delay + 1
357
                end
358
        end
359
        local ratio = (height == 0) and (0) or (width / height)
360
        frame.Size = UDim2.new(size.X.Scale * ratio, size.X.Offset * ratio, size.Y.Scale, size.Y.Offset)
361
        return frame, height, width, (length + punctuation_delay) / 30
362
end
363
function DrawMultilineTextNetwork(text, font, size, delay_offset, ...)
364
        local align = TextAlignment(...)
365
        local frame = Instance.new("Frame")
366
        frame.BackgroundTransparency = 1
367
        frame.BorderSizePixel = 0
368
        local height = 0
369
        local width = 0
370
        local objects = {}
371
        for line in gmatch(text .. "\n", "([^\n]*)\n") do
372
                local line_obj, line_h, line_w, line_delay = DrawTextNetwork(line, font, size, delay_offset)
373
                insert(objects, {line_obj, line_h, line_w})
374
                height = height + line_h
375
                width = max(line_w, width)
376
                delay_offset = delay_offset + line_delay
377
        end
378
        local offset = 0
379
        for index, line_data in ipairs(objects) do
380
                local line_obj, line_h, line_w = unpack(line_data)
381
                local align_offset
382
                if align == TextAlignment.Left then
383
                        align_offset = 0
384
                elseif align == TextAlignment.Center then
385
                        align_offset = 0.5 - line_w / width / 2
386
                elseif align == TextAlignment.Right then
387
                        align_offset = 1 - line_w / width
388
                end
389
                line_obj.Position = UDim2.new(align_offset, 0, offset / height, 0)
390
                line_obj.Parent = frame
391
                offset = offset + line_h
392
        end
393
        local line_count = #objects
394
        local ratio = (height == 0) and (0) or (line_count * width / height)
395
        frame.Size = UDim2.new(size.X.Scale * ratio, size.X.Offset * ratio, size.Y.Scale * line_count, size.Y.Offset * line_count)
396
        return frame, height, width
397
end
398
end
399
 
400
LoadFixedFont(FONT_CUSTOM_A, FONT_CUSTOM_A_SRC, 8, 6)
401
ChatBubble.FONT_DEFAULT = FONT_CUSTOM_A
402
ChatBubble.SetTheme("Rainbow")
403
 
404
chat_bubbles = {}
405
 
406
function CreateChatBubble(bubble_info)
407
        local creation_time, text, backup = bubble_info[1], bubble_info[2], bubble_info[8]
408
        local billboard, frame, label
409
        if backup and false then
410
                billboard = backup:Clone()
411
                frame = billboard.Frame
412
                label = frame.Label
413
                bubble_info[5] = billboard
414
                bubble_info[6] = frame
415
                bubble_info[7] = label
416
                billboard.Parent = Workspace
417
        else
418
                label = DrawMultilineTextNetwork(text, bubble_info[9], UDim2.new(0, 12, 0, 16), creation_time - time(), "Center")
419
                label.Name = "Label"
420
                label.Position = UDim2.new(0, 16, 0, 16)
421
                billboard = Instance.new("BillboardGui", Workspace)
422
                billboard.Adornee = chatAdornee
423
                billboard.AlwaysOnTop = true
424
                billboard.Size = UDim2.new(label.Size.X.Scale, label.Size.X.Offset + 32, label.Size.Y.Scale, label.Size.Y.Offset + 32)
425
                billboard.SizeOffset = Vector2.new(0, 0)
426
                billboard.StudsOffset = Vector3.new(0, 1, 0)
427
                frame = Instance.new("Frame", billboard)
428
                bubble_info[5] = billboard
429
                bubble_info[6] = frame
430
                bubble_info[7] = label
431
                local background_color = bubble_info[10]
432
                if type(background_color) == "function" then
433
                        background_color(bubble_info)
434
                else
435
                        frame.BackgroundColor3 = background_color
436
                end
437
                frame.BackgroundTransparency = 0.3
438
                frame.BorderSizePixel = 0
439
                frame.ClipsDescendants = true
440
                frame.Name = "Frame"
441
                frame.Size = UDim2.new(1, 0, 0, 0)
442
                label.Parent = frame
443
                -- bubble_info[8] = billboard:Clone()
444
        end
445
end
446
local tween_time = 0.3
447
function ConfigureChatBubble(bubble_info)
448
        local creation_time, destruction_time, billboard, frame = bubble_info[1], bubble_info[3], bubble_info[5], bubble_info[6]
449
        if not billboard or billboard.Parent ~= workspace then
450
                CreateChatBubble(bubble_info)
451
                billboard, frame = bubble_info[5], bubble_info[6]
452
        end
453
        if billboard.Adornee ~= chatAdornee then
454
                billboard.Adornee = chatAdornee
455
        end
456
        local current_time = time()
457
        local elapsed_time = current_time - creation_time
458
        local remaining_time = destruction_time - current_time
459
        if remaining_time < 0 then
460
                bubble_info[4] = false
461
                billboard:Destroy()
462
                return false
463
        elseif remaining_time < tween_time then
464
                local tween_progress = math.sin(remaining_time * math.pi / (tween_time * 2))
465
                frame.Size = UDim2.new(1, 0, tween_progress, 0)
466
        elseif elapsed_time < tween_time then
467
                local tween_progress = math.sin(elapsed_time * math.pi / (tween_time * 2))
468
                frame.Size = UDim2.new(1, 0, tween_progress, 0)
469
        elseif frame.Size ~= UDim2.new(1, 0, 1, 0) then
470
                frame.Size = UDim2.new(1, 0, 1, 0)
471
        end
472
        return true
473
end
474
function ChatBubble.MainLoop()
475
        local offset = 0
476
        local removing = {}
477
        for index, bubble_info in ipairs(chat_bubbles) do
478
                if not ConfigureChatBubble(bubble_info) then
479
                        removing[#removing + 1] = index - #removing
480
                else
481
                        local billboard, frame = bubble_info[5], bubble_info[6]
482
                        local billboard_h = billboard.Size.Y.Offset
483
                        local bubble_h = frame.Size.Y.Scale * billboard_h
484
                        offset = 8 + offset + bubble_h
485
                        billboard.SizeOffset = Vector2.new(0, offset / billboard_h - 0.5)
486
                end
487
        end
488
        for index, bubble_index in ipairs(removing) do
489
                table.remove(chat_bubbles, bubble_index)
490
        end
491
        RunService.Stepped:wait()
492
end
493
function WrapText(text, character_limit, line_length_limit)
494
        if #text > character_limit then
495
                text = string.sub(text, 1, character_limit - 3) .. "..."
496
        end
497
        local text_length = #text
498
        local line_length = 0
499
        local i = 0
500
        while i <= text_length do
501
                i = i + 1
502
                local character = string.sub(text, i, i)
503
                if character == "\t" then
504
                        local tabulation_size = 4 - line_length % 4
505
                        line_length = line_length + tabulation_size
506
                        if line_length >= line_length_limit then
507
                                tabulation_size = line_length - line_length_limit
508
                                line_length = 0
509
                                text_length = text_length + tabulation_size
510
                                text = string.sub(text, 1, i - 1) .. string.rep(" ", tabulation_size) .. "\n" .. string.sub(text, i + 1)
511
                                i = i + tabulation_size + 1
512
                        else
513
                                text_length = text_length + tabulation_size - 1
514
                                text = string.sub(text, 1, i - 1) .. string.rep(" ", tabulation_size) .. string.sub(text, i + 1)
515
                                i = i + tabulation_size - 1
516
                        end
517
                elseif character == "\n" then
518
                        line_length = 0
519
                else
520
                        line_length = line_length + 1
521
                        if line_length >= line_length_limit then
522
                                local k = i - line_length + 1
523
                                local success = false
524
                                for j = i, k, -1 do
525
                                        if string.match(string.sub(text, j, j), "[ \t]") then
526
                                                text = string.sub(text, 1, j - 1) .. "\n" .. string.sub(text, j + 1)
527
                                                text_length = text_length + 1
528
                                                success = true
529
                                                break
530
                                        end
531
                                end
532
                                if not success then
533
                                        text = string.sub(text, 1, i) .. "\n" .. string.sub(text, i + 1)
534
                                        text_length = text_length + 1
535
                                end
536
                                i = i + 1
537
                                line_length = 0
538
                        end
539
                end
540
        end
541
        if #text > character_limit then
542
                text = string.sub(text, 1, character_limit - 3) .. "..."
543
        end
544
        return text
545
end
546
function ChatBubble.Create(text, theme)
547
        local text = WrapText(text, 200, 30)
548
        local creation_time = time()
549
        local bubble_info = {creation_time, text, creation_time + 6 + #text / 15, true}
550
        local previousTheme
551
        if theme then
552
                previousTheme = ChatBubble.GetTheme()
553
                ChatBubble.SetTheme(theme)
554
        end
555
        bubble_info[9] = ChatBubble.font
556
        bubble_info[10] = ChatBubble.background_color
557
        if previousTheme then
558
                ChatBubble.SetTheme(previousTheme)
559
        end
560
        table.insert(chat_bubbles, 1, bubble_info)
561
end
562
TaskScheduler.Start(function()
563
        while true do
564
                ChatBubble.MainLoop()
565
        end
566
end)
567
 
568
PyramidCharacter = {};
569
 
570
local stock_triangle = Instance.new("WedgePart")
571
stock_triangle.Anchored = true
572
stock_triangle.BottomSurface = "Smooth"
573
stock_triangle.FormFactor = "Custom"
574
stock_triangle.Locked = true
575
stock_triangle.TopSurface = "Smooth"
576
local stock_triangle_mesh = Instance.new("SpecialMesh", stock_triangle)
577
stock_triangle_mesh.MeshType = "Wedge"
578
local triangles = {}
579
function PyramidCharacter.CreateTriangle(v1, v2, v3, properties, parent, index)
580
        local triangleInfo = triangles[index]
581
        local side1 = (v1 - v2).magnitude
582
        local side2 = (v2 - v3).magnitude
583
        local side3 = (v3 - v1).magnitude
584
        local sqrside1 = side1 * side1
585
        local sqrside2 = side2 * side2
586
        local sqrside3 = side3 * side3
587
        if sqrside3 + sqrside1 == sqrside2 then
588
                v1, v2, v3 = v1, v2, v3
589
        elseif sqrside1 + sqrside2 == sqrside3 then
590
                v1, v2, v3 = v2, v3, v1
591
        elseif sqrside2 + sqrside3 == sqrside1 then
592
                v1, v2, v3 = v3, v1, v2
593
        elseif sqrside1 >= sqrside2 and sqrside1 >= sqrside3 then
594
                v1, v2, v3 = v1, v2, v3
595
        elseif sqrside2 >= sqrside3 and sqrside2 >= sqrside1 then
596
                v1, v2, v3 = v2, v3, v1
597
        else
598
                v1, v2, v3 = v3, v1, v2
599
        end
600
        local model, part1, part2, mesh1, mesh2
601
        if triangleInfo then
602
                model, part1, part2, mesh1, mesh2 = unpack(triangleInfo)
603
                if not (model.Parent == parent and part1.Parent == model and part2.Parent == model and mesh1.Parent == part1 and mesh2.Parent == part2) then
604
                        if model.Parent then
605
                                model:Destroy()
606
                        end                    
607
                        model = nil
608
                end
609
        else
610
                triangleInfo = {}
611
                triangles[index] = triangleInfo
612
        end
613
        if not model then
614
                model = Instance.new("Model")
615
                part1 = stock_triangle:Clone()
616
                part2 = stock_triangle:Clone()
617
                mesh1 = part1.Mesh
618
                mesh2 = part2.Mesh
619
                part1.Parent = model
620
                part2.Parent = model
621
                triangleInfo[1] = model
622
                triangleInfo[2] = part1
623
                triangleInfo[3] = part2
624
                triangleInfo[4] = mesh1
625
                triangleInfo[5] = mesh2
626
        end
627
        for key, value in pairs(properties) do
628
                part1[key] = value
629
                part2[key] = value
630
        end
631
        local cframe = CFrame.new(v1, v2)
632
        local relpos = cframe:pointToObjectSpace(v3)
633
        cframe = cframe * CFrame.fromEulerAnglesXYZ(0, 0, -math.atan2(relpos.x, relpos.y))
634
        local rel1 = cframe:pointToObjectSpace(v1)
635
        local rel2 = cframe:pointToObjectSpace(v2)
636
        local rel3 = cframe:pointToObjectSpace(v3)
637
        local height = rel3.y
638
        local width1 = rel3.z
639
        local width2 = rel2.z - rel3.z
640
        local relcenter1 = Vector3.new(0, height / 2, width1 / 2)
641
        local center1 = cframe:pointToWorldSpace(relcenter1)
642
        local relcenter2 = Vector3.new(0, height / 2, width2 / 2 + width1)
643
        local center2 = cframe:pointToWorldSpace(relcenter2)
644
        height = math.abs(height)
645
        width1 = math.abs(width1)
646
        width2 = math.abs(width2)
647
        if not part1.Anchored then
648
                part1.Anchored = true
649
        end
650
        part1.Size = Vector3.new(0.2, height, width1)
651
        part1.CFrame = cframe * CFrame.fromEulerAnglesXYZ(0, math.pi, 0) - cframe.p + center1  
652
        mesh1.Scale = Vector3.new(0, height / part1.Size.y, width1 / part1.Size.z)
653
        if not part2.Anchored then
654
                part2.Anchored = true
655
        end
656
        part2.Size = Vector3.new(0.2, height, width1)
657
        part2.CFrame = cframe - cframe.p + center2
658
        mesh2.Scale = Vector3.new(0, height / part1.Size.y, width2 / part2.Size.z)
659
        model.Parent = parent
660
        return model
661
end
662
PyramidCharacter.head_properties = {BrickColor = BrickColor.new(Color3.new(1, 1, 1)), Transparency = 0.5}
663
PyramidCharacter.head_radius = math.pi
664
PyramidCharacter.center = CFrame.new(0, 10, 0)
665
PyramidCharacter.point1 = Vector3.new()
666
PyramidCharacter.point2 = Vector3.new()
667
PyramidCharacter.point3 = Vector3.new()
668
PyramidCharacter.point4 = Vector3.new()
669
PyramidCharacter.core_mesh_scale = Vector3.new(0.833, 0.833, 0.833)
670
PyramidCharacter.visible = false
671
function PyramidCharacter.Teleport(location)
672
        PyramidCharacter.point1 = location
673
        PyramidCharacter.point2 = location
674
        PyramidCharacter.point3 = location
675
        PyramidCharacter.point4 = location
676
end
677
local stock_core = Instance.new("Part")
678
stock_core.Anchored = true
679
stock_core.BottomSurface = "Smooth"
680
stock_core.Color = Color3.new(1, 1, 1)
681
stock_core.FormFactor = "Custom"
682
stock_core.Locked = true
683
stock_core.Name = "CubePyramid"
684
stock_core.Size = Vector3.new(0.5, 0.5, 0.5)
685
stock_core.TopSurface = "Smooth"
686
PyramidCharacter.stock_core = stock_core
687
PyramidCharacter.core = stock_core:Clone()
688
PyramidCharacter.Archivable = false
689
PyramidCharacter.core_mesh = Instance.new("BlockMesh", core)
690
PyramidCharacter.core_lights = {}
691
PyramidCharacter.coreLightCount = 1
692
for index = 1, PyramidCharacter.coreLightCount do
693
        PyramidCharacter.core_lights[index] = Instance.new("PointLight", core)
694
end
695
PyramidCharacter.camera_distance = (Camera.Focus.p - Camera.CoordinateFrame.p).magnitude
696
PyramidCharacter.camera_position = Vector3.new()
697
Camera.Changed:connect(function(property)
698
        if PyramidCharacter.visible then
699
                if property == "CoordinateFrame" then
700
                        local cframe, focus = Camera.CoordinateFrame, Camera.Focus
701
                        local eventTime = time()
702
                        local connection
703
                        connection = Camera.Changed:connect(function()
704
                                connection:disconnect()
705
                                if eventTime == time() and Camera.Focus ~= focus then
706
                                        local camera_distance = PyramidCharacter.camera_distance
707
                                        Camera.Focus = Camera.CoordinateFrame * CFrame.new(0, 0, -camera_distance)
708
                                        PyramidCharacter.camera_position = (Camera.CoordinateFrame * CFrame.new(0, 0, -camera_distance)).p
709
                                end
710
                        end)
711
                        coroutine.yield()
712
                        if Camera.Focus == focus then
713
                                PyramidCharacter.camera_distance = (focus.p - cframe.p).magnitude
714
                        else
715
                                local camera_distance = PyramidCharacter.camera_distance
716
                                Camera.Focus = Camera.CoordinateFrame * CFrame.new(0, 0, -camera_distance)
717
                                PyramidCharacter.camera_position = (Camera.CoordinateFrame * CFrame.new(0, 0, -camera_distance)).p
718
                        end
719
                        if connection.connected then
720
                                connection:disconnect()
721
                        end
722
                end
723
        end
724
end)
725
function PyramidCharacter.Animate()
726
        local total_time = time()
727
        local core = PyramidCharacter.core
728
        local frame = PyramidCharacter.frame
729
        if PyramidCharacter.visible then
730
                local core_mesh = PyramidCharacter.core_mesh
731
                local core_lights = PyramidCharacter.core_lights
732
                if not frame or frame.Parent ~= core then
733
                        frame = Instance.new("Model")
734
                        frame.Archivable = false
735
                        frame.Parent = core
736
                        PyramidCharacter.frame = frame
737
                end
738
                if core.Parent ~= Workspace then
739
                        core = PyramidCharacter.stock_core:Clone()
740
                        PyramidCharacter.core = core
741
                        core.Archivable = false
742
                        core.Parent = Workspace
743
                        chatAdornee = core
744
                end
745
                if core_mesh.Parent ~= core then
746
                        core_mesh = Instance.new("BlockMesh", core)
747
                        PyramidCharacter.core_mesh = core_mesh
748
                end
749
                for index, core_light in ipairs(core_lights) do
750
                        if core_light.Parent ~= core then
751
                                core_light = Instance.new("PointLight", core)
752
                                core_lights[index] = core_light
753
                        end
754
                        local vertexColor = Vector3.new(Utility.GetRainbowRGB(total_time)) * 0.25 + Vector3.new(1, 1, 1) * 0.75
755
                        core_light.Color = Color3.new(vertexColor.X, vertexColor.Y, vertexColor.Z)
756
                        core_light.Brightness = 0.85 + 0.15 * math.random()
757
                        if core_light.Range ~= 30 then
758
                                core_light.Range = 30
759
                        end
760
                        if not core_light.Shadows then
761
                                core_light.Shadows = true
762
                        end
763
                end
764
                if core_mesh.Offset ~= Vector3.new(0, 0, 0) then
765
                        core_mesh.Offset = Vector3.new(0, 0, 0)
766
                end
767
                if not core.Anchored then
768
                        core.Anchored = true
769
                end
770
                if core.Transparency ~= 0 then
771
                        core.Transparency = 0
772
                end
773
                local core_mesh_scale = PyramidCharacter.core_mesh_scale
774
                local transition_speed = (math.sin(total_time * math.tau) + 1) / 16
775
                core_mesh_scale = core_mesh_scale * (1 - transition_speed) + Vector3.new(math.random() * 0.5 + 0.5, math.random() * 0.5 + 0.5, math.random()
776
 
777
* 0.5 + 0.5) * transition_speed
778
                core_mesh.Scale = core_mesh_scale * 2
779
                local center = CFrame.new(PyramidCharacter.camera_position) * CFrame.Angles(0, total_time * math.tau, 0)
780
                local cframe1 = CFrame.new(PyramidCharacter.head_radius, 0, 0)
781
                local cframe2 = CFrame.Angles(math.tau / -3, 0, 0)
782
                local cframe3 = CFrame.Angles(0, math.tau / 3, 0)
783
                local cframe4 = center * cframe3              
784
                local desired1 = center * CFrame.new(0, PyramidCharacter.head_radius, 0)
785
                local desired2 = center * cframe2 * cframe1
786
                local desired3 = cframe4 * cframe2 * cframe1
787
                local desired4 = cframe4 * cframe3 * cframe2 * cframe1
788
                local point1 = (PyramidCharacter.point1 * 3 + desired1.p) / 4
789
                local point2 = (PyramidCharacter.point2 * 3 + desired2.p) / 4
790
                local point3 = (PyramidCharacter.point3 * 3 + desired3.p) / 4
791
                local point4 = (PyramidCharacter.point4 * 3 + desired4.p) / 4
792
                PyramidCharacter.point1 = point1
793
                PyramidCharacter.point2 = point2
794
                PyramidCharacter.point3 = point3
795
                PyramidCharacter.point4 = point4
796
                local head_properties = PyramidCharacter.head_properties
797
                PyramidCharacter.CreateTriangle(point1, point2, point3, head_properties, frame, 1).Archivable = false
798
                PyramidCharacter.CreateTriangle(point2, point3, point4, head_properties, frame, 2).Archivable = false
799
                PyramidCharacter.CreateTriangle(point3, point4, point1, head_properties, frame, 3).Archivable = false
800
                PyramidCharacter.CreateTriangle(point4, point1, point2, head_properties, frame, 4).Archivable = false
801
                core.CFrame = CFrame.new((point1 + point2 + point3 + point4) / 4) * CFrame.Angles(total_time * math.tau, total_time * math.tau / 2,
802
 
803
total_time * math.tau / 3)
804
                PyramidCharacter.center = center
805
        else
806
                if core.Parent then
807
                        core:Destroy()
808
                end
809
                if frame and frame.Parent then
810
                        frame:Destroy()
811
                end
812
                PyramidCharacter.frame = nil
813
        end
814
end
815
function PyramidCharacter.MainLoop()
816
        PyramidCharacter.Animate()
817
        RunService.Stepped:wait()
818
end
819
TaskScheduler.Start(function()
820
        while true do
821
                PyramidCharacter.MainLoop()
822
        end
823
end)
824
 
825
RBXInstance = {};
826
 
827
RBXInstance.init_metatable = {}
828
function RBXInstance.init_metatable:__call(data)
829
        local instance = Instance.new(self[1])
830
        for key, value in pairs(data) do
831
                if type(key) == "number" then
832
                        value.Parent = instance
833
                else
834
                        instance[key] = value
835
                end
836
        end
837
        return instance
838
end
839
function RBXInstance.new(className)
840
        return setmetatable({className}, RBXInstance.init_metatable)
841
end
842
 
843
Utility = {};
844
 
845
function Utility.CleanLighting()
846
        Lighting.Ambient = Color3.new(0, 0, 0)
847
        Lighting.Brightness = 1
848
        Lighting.ColorShift_Bottom = Color3.new(0, 0, 0)
849
        Lighting.ColorShift_Top = Color3.new(0, 0, 0)
850
        Lighting.FogColor = Color3.new(0.75294125080109, 0.75294125080109, 0.75294125080109)
851
        Lighting.FogEnd = 100000
852
        Lighting.FogStart = 0
853
        Lighting.GeographicLatitude = 41.733299255371095
854
        Lighting.GlobalShadows = true
855
        Lighting.OutdoorAmbient = Color3.new(0.5, 0.5, 0.5)
856
        Lighting.Outlines = false
857
        Lighting.ShadowColor = Color3.new(0.70196080207825, 0.70196080207825, 0.72156864404678)
858
        Lighting.TimeOfDay = "14:00:00"
859
        for index, child in ipairs(Lighting:GetChildren()) do
860
                if child:IsA("Sky") then
861
                        child:Destroy()
862
                end
863
        end
864
end
865
 
866
function Utility.GetProperty(object, field)
867
        return object[field]
868
end
869
 
870
function Utility.CaseInsensitivePattern(pattern)
871
        return string.gsub(pattern, "(%%?)(.)", Utility.CaseInsensitivePatternReplaceFunc)
872
end
873
function Utility.CaseInsensitivePatternReplaceFunc(percent, letter)
874
        if percent ~= "" or not letter:match("%a") then
875
                return percent .. letter
876
        else
877
                return "[" .. string.lower(letter) .. string.upper(letter) .. "]"
878
        end
879
end
880
function Utility.FindHumanoidClosestToRay(ray, exlusionList)
881
        local view = CFrame.new(ray.Origin, ray.Origin + ray.Direction)
882
        local inverseView = view:inverse()
883
        local objects = Workspace:GetChildren()
884
        local numObjects = #objects
885
        local minDistance = math.huge
886
        local closestHumanoid, closestTorso, closestTorsoPosition
887
        for index, object in ipairs(objects) do
888
                for index, child in ipairs(object:GetChildren()) do
889
                        numObjects = numObjects + 1
890
                        objects[numObjects] = child
891
                end
892
                if object.ClassName == "Humanoid" and object.Health > 0 then
893
                        local torso = object.Torso
894
                        if torso and not (exlusionList and exlusionList[torso]) then
895
                                local torsoPosition = torso.Position
896
                                local relativePosition = inverseView * torsoPosition
897
                                local distanceZ = -relativePosition.Z
898
                                if distanceZ > 0 then
899
                                        local distance = (inverseView * torsoPosition * Vector3.new(1, 1, 0)).magnitude / distanceZ
900
                                        if distance < 0.25 and distance < minDistance then
901
                                                closestHumanoid = object
902
                                                closestTorso = torso
903
                                                closestTorsoPosition = torsoPosition
904
                                                minDistance = distance
905
                                        end
906
                                end
907
                        end
908
                end
909
        end
910
        return closestHumanoid, closestTorso, closestTorsoPosition, minDistance
911
end
912
function Utility.FindLocalHead()
913
        if Player then
914
                local head, position, view
915
                pcall(function()
916
                        position = Camera.Focus.p
917
                        view = Camera.CoordinateFrame
918
                end)
919
                pcall(function()
920
                        for _, child in ipairs(Workspace:GetChildren()) do
921
                                if Players:GetPlayerFromCharacter(child) == Player then
922
                                        for _, child in ipairs(child:GetChildren()) do
923
                                                if tostring(child) == "Head" and pcall(assert, pcall(Game.IsA, child, "BasePart")) then
924
                                                        head = child
925
                                                        break
926
                                                end
927
                                        end
928
                                        break
929
                                end
930
                        end
931
                        if not head and view then
932
                                local min_distance = math.huge
933
                                local objects = Workspace:GetChildren()
934
                                for _, object in ipairs(objects) do
935
                                        local success, is_part = pcall(Game.IsA, object, "BasePart")
936
                                        if success and is_part then
937
                                                pcall(function()
938
                                                        local distance = (view:pointToObjectSpace(object.Position) * Vector3.new(1, 1, 0)).magnitude
939
                                                        if distance < min_distance and distance < 1 then
940
                                                                min_distance = distance
941
                                                                head = object
942
                                                        elseif tostring(object) == "Head" and tostring(object.Parent):lower():match("^" .. tostring(Player):lower()) then
943
                                                                min_distance = 0
944
                                                                head = object
945
                                                        end
946
                                                end)
947
                                                if min_distance < 5e-4 then
948
                                                        break
949
                                                end
950
                                        end
951
                                                pcall(function()
952
                                                if not object:IsA("Camera") then
953
                                                        for _, child in ipairs(object:GetChildren()) do
954
                                                                objects[#objects + 1] = child
955
                                                        end
956
                                                end
957
                                        end)
958
                                end
959
                        end
960
                end)
961
                return head, position, view
962
        end
963
end
964
function Utility.GetBuildingTools()
965
        local backpack = Player:FindFirstChild("Backpack")
966
        if backpack then
967
                local moveTool = Instance.new("HopperBin")
968
                local cloneTool = Instance.new("HopperBin")
969
                local deleteTool = Instance.new("HopperBin")
970
                moveTool.BinType = Enum.BinType.GameTool
971
                cloneTool.BinType = Enum.BinType.Clone
972
                deleteTool.BinType = Enum.BinType.Hammer
973
                moveTool.Parent = backpack
974
                cloneTool.Parent = backpack
975
                deleteTool.Parent = backpack
976
        end
977
end
978
function Utility.Rejoin()
979
        Workspace.Parent:service'TeleportService':Teleport(Game.PlaceId)
980
end
981
 
982
function Utility.BlockRobloxFilter(text)
983
        return string.gsub(text, ".", "%1\143")
984
end
985
 
986
function Utility.GetTimestamp()
987
        local unix_time = tick()
988
        local time_secs = math.floor(unix_time % 60)
989
        local time_mins = math.floor(unix_time / 60 % 60)
990
        local time_hours = math.floor(unix_time / 3600 % 24)
991
        return string.format("%02i:%02i:%02i", time_hours, time_mins, time_secs)
992
end
993
 
994
function Utility.GetRainbowRGB(hue)
995
        local section = hue % 1 * 3
996
        local secondary = 0.5 * math.pi * (section % 1)
997
        if section < 1 then
998
                return 1, 1 - math.cos(secondary), 1 - math.sin(secondary)
999
        elseif section < 2 then
1000
                return 1 - math.sin(secondary), 1, 1 - math.cos(secondary)
1001
        else
1002
                return 1 - math.cos(secondary), 1 - math.sin(secondary), 1
1003
        end
1004
end
1005
 
1006
function Utility.SetProperty(object, field, value)
1007
        object[field] = value
1008
end
1009
 
1010
function Utility.CleanWorkspace()
1011
        for index, child in ipairs(Workspace:GetChildren()) do
1012
                if not (Players:GetPlayerFromCharacter(child) or child.ClassName == "Camera" or child:IsA("Script") or child.ClassName == "Terrain") then
1013
                        pcall(child.Destroy, child)
1014
                end
1015
        end
1016
        Workspace.Terrain:Clear()
1017
        local base = Instance.new("Part")
1018
        base.Anchored = true
1019
        base.BrickColor = BrickColor.new("Earth green")
1020
        base.Locked = true
1021
        base.Name = "Base"
1022
        base.Size = Vector3.new(512, 1.2, 512)
1023
        base.Parent = Workspace
1024
end
1025
 
1026
function Utility.CleanWorkspaceAndScripts()
1027
        for index, child in ipairs(Workspace:GetChildren()) do
1028
                if not (Players:GetPlayerFromCharacter(child) or child.ClassName == "Camera" or child.ClassName == "Terrain") then
1029
                        pcall(child.Destroy, child)
1030
                end
1031
        end
1032
        Workspace.Terrain:Clear()
1033
        local base = Instance.new("Part")
1034
        base.Anchored = true
1035
        base.BrickColor = BrickColor.new("Earth green")
1036
        base.Locked = true
1037
        base.Name = "Base"
1038
        base.Size = Vector3.new(512, 1.2, 512)
1039
        base.Parent = Workspace
1040
end
1041
 
1042
function Utility.CreateDummy(cframe, name, parent)
1043
        local model = Instance.new("Model")
1044
        model.Archivable = false
1045
        model.Name = name
1046
        local humanoid = Instance.new("Humanoid", model)
1047
        local head = Instance.new("Part", model)
1048
        local face = Instance.new("Decal", head)
1049
        local head_mesh = Instance.new("SpecialMesh", head)
1050
        local torso = Instance.new("Part", model)
1051
        local right_arm = Instance.new("Part", model)
1052
        local left_arm = Instance.new("Part", model)
1053
        local right_leg = Instance.new("Part", model)
1054
        local left_leg = Instance.new("Part", model)
1055
        local neck = Instance.new("Motor", torso)
1056
        local right_shoulder = Instance.new("Motor", torso)
1057
        local left_shoulder = Instance.new("Motor", torso)
1058
        local right_hip = Instance.new("Motor", torso)
1059
        local left_hip = Instance.new("Motor", torso)
1060
        head.BrickColor = BrickColor.Yellow()
1061
        head.CFrame = cframe * CFrame.new(0, 1.5, 0)
1062
        head.FormFactor = "Symmetric"
1063
        head.Locked = true
1064
        head.Name = "Head"
1065
        head.Size = Vector3.new(2, 1, 1)
1066
        head.TopSurface = "Smooth"
1067
        face.Texture = "rbxasset://textures/face.png"
1068
        head_mesh.Scale = Vector3.new(1.25, 1.25, 1.25)
1069
        torso.BrickColor = BrickColor.Blue()
1070
        torso.CFrame = cframe
1071
        torso.FormFactor = "Symmetric"
1072
        torso.LeftSurface = "Weld"
1073
        torso.Locked = true
1074
        torso.RightSurface = "Weld"
1075
        torso.Name = "Torso"
1076
        torso.Size = Vector3.new(2, 2, 1)
1077
        right_arm.BrickColor = BrickColor.Yellow()
1078
        right_arm.CanCollide = false
1079
        right_arm.CFrame = cframe * CFrame.new(1.5, 0, 0)
1080
        right_arm.FormFactor = "Symmetric"
1081
        right_arm.Locked = true
1082
        right_arm.Name = "Right Arm"
1083
        right_arm.Size = Vector3.new(1, 2, 1)
1084
        left_arm.BrickColor = BrickColor.Yellow()
1085
        left_arm.CanCollide = false
1086
        left_arm.CFrame = cframe * CFrame.new(-1.5, 0, 0)
1087
        left_arm.FormFactor = "Symmetric"
1088
        left_arm.Locked = true
1089
        left_arm.Name = "Left Arm"
1090
        left_arm.Size = Vector3.new(1, 2, 1)
1091
        right_leg.BrickColor = BrickColor.new("Br. yellowish green")
1092
        right_leg.BottomSurface = "Smooth"
1093
        right_leg.CanCollide = false
1094
        right_leg.CFrame = cframe * CFrame.new(0.5, -2, 0)
1095
        right_leg.FormFactor = "Symmetric"
1096
        right_leg.Locked = true
1097
        right_leg.Name = "Right Leg"
1098
        right_leg.Size = Vector3.new(1, 2, 1)
1099
        right_leg.TopSurface = "Smooth"
1100
        left_leg.BrickColor = BrickColor.new("Br. yellowish green")
1101
        left_leg.BottomSurface = "Smooth"
1102
        left_leg.CanCollide = false
1103
        left_leg.CFrame = cframe * CFrame.new(-0.5, -2, 0)
1104
        left_leg.FormFactor = "Symmetric"
1105
        left_leg.Locked = true
1106
        left_leg.Name = "Left Leg"
1107
        left_leg.Size = Vector3.new(1, 2, 1)
1108
        left_leg.TopSurface = "Smooth"
1109
        neck.C0 = CFrame.new(0, 1, 0, -1, -0, -0, 0, 0, 1, 0, 1, 0)
1110
        neck.C1 = CFrame.new(0, -0.5, 0, -1, -0, -0, 0, 0, 1, 0, 1, 0)
1111
        neck.Name = "Neck"
1112
        neck.Part0 = torso
1113
        neck.Part1 = head
1114
        right_shoulder.C0 = CFrame.new(1, 0.5, 0, 0, 0, 1, 0, 1, 0, -1, -0, -0)
1115
        right_shoulder.C1 = CFrame.new(-0.5, 0.5, 0, 0, 0, 1, 0, 1, 0, -1, -0, -0)
1116
        right_shoulder.MaxVelocity = 0.15
1117
        right_shoulder.Name = "Right Shoulder"
1118
        right_shoulder.Part0 = torso
1119
        right_shoulder.Part1 = right_arm
1120
        left_shoulder.C0 = CFrame.new(-1, 0.5, 0, -0, -0, -1, 0, 1, 0, 1, 0, 0)
1121
        left_shoulder.C1 = CFrame.new(0.5, 0.5, 0, -0, -0, -1, 0, 1, 0, 1, 0, 0)
1122
        left_shoulder.MaxVelocity = 0.15
1123
        left_shoulder.Name = "Left Shoulder"
1124
        left_shoulder.Part0 = torso
1125
        left_shoulder.Part1 = left_arm
1126
        right_hip.C0 = CFrame.new(1, -1, 0, 0, 0, 1, 0, 1, 0, -1, -0, -0)
1127
        right_hip.C1 = CFrame.new(0.5, 1, 0, 0, 0, 1, 0, 1, 0, -1, -0, -0)
1128
        right_hip.MaxVelocity = 0.1
1129
        right_hip.Name = "Right Hip"
1130
        right_hip.Part0 = torso
1131
        right_hip.Part1 = right_leg
1132
        left_hip.C0 = CFrame.new(-1, -1, 0, -0, -0, -1, 0, 1, 0, 1, 0, 0)
1133
        left_hip.C1 = CFrame.new(-0.5, 1, 0, -0, -0, -1, 0, 1, 0, 1, 0, 0)
1134
        left_hip.MaxVelocity = 0.1
1135
        left_hip.Name = "Left Hip"
1136
        left_hip.Part0 = torso
1137
        left_hip.Part1 = left_leg
1138
        humanoid.Died:connect(function()
1139
                wait(5)
1140
                model:Destroy()
1141
        end)
1142
        model.Parent = parent
1143
        return model  
1144
end
1145
 
1146
Serializer = {};
1147
 
1148
Serializer.NAN = math.abs(0 / 0)
1149
 
1150
function Serializer.DecodeFloatArray(metadata_size, lookup, data, index)
1151
        local metadata_bytes = math.ceil(metadata_size * 0.25)
1152
        local metadata = {string.byte(data, index, index + metadata_bytes - 1)}
1153
        local components = {}
1154
        local start_index = index
1155
        index = index + metadata_bytes
1156
        for byte_index, byte in ipairs(metadata) do
1157
                local last_offset = 3
1158
                if byte_index == metadata_bytes then
1159
                        last_offset = (metadata_size - 1) % 4
1160
                end
1161
                for value_offset = 0, last_offset do
1162
                        local value_code = byte * 0.25 ^ value_offset % 4
1163
                        value_code = value_code - value_code % 1
1164
                        if value_code == 0 then
1165
                                table.insert(components, Serializer.DecodeFloat32(string.byte(data, index, index + 3)))
1166
                                index = index + 4
1167
                        else
1168
                                table.insert(components, lookup[value_code])
1169
                        end
1170
                end
1171
        end
1172
        return components, index - start_index
1173
end
1174
function Serializer.EncodeFloatArray(values, common)
1175
        local lookup = {[common[1]] = 1, [common[2]] = 2, [common[3]] = 3}
1176
        local value_count = #values
1177
        local metadata_bytes = math.ceil(value_count * 0.25)
1178
        local metadata = {}
1179
        local buffer = {}
1180
        for byte_index = 1, metadata_bytes do
1181
                local last_offset = 3
1182
                if byte_index == metadata_bytes then
1183
                        last_offset = (value_count - 1) % 4
1184
                end
1185
                local metadata_byte = 0
1186
                local offset_multiplier = 1
1187
                local byte_offset = (byte_index - 1) * 4 + 1
1188
                for value_offset = 0, last_offset do
1189
                        local value_index = byte_offset + value_offset
1190
                        local value = values[value_index]
1191
                        local code = lookup[value] or 0
1192
                        metadata_byte = metadata_byte + code * offset_multiplier
1193
                        offset_multiplier = offset_multiplier * 4
1194
                        if code == 0 then
1195
                                table.insert(buffer, Serializer.EncodeFloat32(value))
1196
                        end
1197
                end
1198
                metadata[byte_index] = string.char(metadata_byte)
1199
        end
1200
        return table.concat(metadata) .. table.concat(buffer)
1201
end
1202
 
1203
function Serializer.DecodeColor3(data, index)
1204
        local components, size = Serializer.DecodeFloatArray(3, {0, 0.5, 1}, data, index)
1205
        return Color3.new(unpack(components)), size
1206
end
1207
function Serializer.DecodeFloat32(b0, b1, b2, b3)
1208
        local b2_low = b2 % 128
1209
        local mantissa = b0 + (b1 + b2_low * 256) * 256
1210
        local exponent = (b2 - b2_low) / 128 + b3 % 128 * 2
1211
        local number
1212
        if mantissa == 0 then
1213
                if exponent == 0 then
1214
                        number = 0
1215
                elseif exponent == 0xFF then
1216
                        number = math.huge
1217
                else
1218
                        number = 2 ^ (exponent - 127)
1219
                end
1220
        elseif exponent == 255 then
1221
                number = Serializer.NAN
1222
        else
1223
                number = (1 + mantissa / 8388608) * 2 ^ (exponent - 127)
1224
        end
1225
        if b3 >= 128 then
1226
                return -number
1227
        else
1228
                return number
1229
        end
1230
end
1231
function Serializer.EncodeColor3(color3)
1232
        return Serializer.EncodeFloatArray({color3.r, color3.g, color3.b}, {0, 0.5, 1})
1233
end
1234
function Serializer.EncodeFloat32(number)
1235
        if number == 0 then
1236
                if 1 / number > 0 then
1237
                        return "\0\0\0\0"
1238
                else
1239
                        return "\0\0\0\128"
1240
                end
1241
        elseif number ~= number then
1242
            if string.sub(tostring(number), 1, 1) == "-" then
1243
                    return "\255\255\255\255"
1244
                else
1245
                    return "\255\255\255\127"
1246
                end
1247
        elseif number == math.huge then
1248
                return "\0\0\128\127"
1249
        elseif number == -math.huge then
1250
                return "\0\0\128\255"
1251
        else
1252
                local b3 = 0
1253
                if number < 0 then
1254
                        number = -number
1255
                        b3 = 128
1256
                end
1257
                local mantissa, exponent = math.frexp(number)
1258
                exponent = exponent + 126
1259
                if exponent < 0 then
1260
                        return "\0\0\0" .. string.char(b3)
1261
                elseif exponent >= 255 then
1262
                        return "\0\0\128" .. string.char(b3 + 0x7F)
1263
                else
1264
                        local fraction = mantissa * 16777216 - 8388608 + 0.5
1265
                        fraction = fraction - fraction % 1
1266
                        local exponent_low = exponent % 2
1267
                        local b0 = fraction % 256
1268
                        local b1 = fraction % 65536
1269
                        local b2 = (fraction - b1) / 65536 + exponent_low * 128
1270
                        b1 = (b1 - b0) / 256
1271
                        b3 = b3 + (exponent - exponent_low) / 2
1272
                        return string.char(b0, b1, b2, b3)
1273
                end
1274
        end
1275
end
1276
 
1277
LuaEnum = {};
1278
 
1279
LuaEnum.enum_metatable = {
1280
        __call = function(self, value)
1281
                local valueType = type(value)
1282
                if valueType == "table" and getmetatable(value) == LuaEnum.enum_item_metatable then
1283
                        return value
1284
                else
1285
                        return self[value]
1286
                end
1287
        end,
1288
        __index = function(self, key)
1289
                local enumItem = self.ItemsByName[key] or self.ItemsByValue[key]
1290
                if enumItem == nil then
1291
                        local default = self.Default
1292
                        if default then
1293
                                Logger.printf("Warning", "%s is not a valid EnumItem, returning default (%s)", Utility.ToString(key), tostring(default))
1294
                                enumItem = default
1295
                        else
1296
                                Logger.errorf(2, "%s is not a valid EnumItem", Utility.ToString(key))
1297
                        end
1298
                end
1299
                return enumItem
1300
        end,
1301
        __tostring = function(self)
1302
                return self.Name
1303
        end
1304
}
1305
LuaEnum.enum_item_metatable = {
1306
        __tostring = function(self)
1307
                return self.Enum.Name .. "." .. self.Name
1308
        end
1309
}
1310
LuaEnum.init_metatable = {
1311
        __call = function(self, items)
1312
                local enumItemsByName = {}
1313
                local enumItemsByValue = {}
1314
                local enum = {
1315
                        ItemsByName = enumItemsByName,
1316
                        ItemsByValue = enumItemsByValue,
1317
                        Name = self[1]
1318
                }
1319
                local default = items.Default
1320
                if default ~= nil then
1321
                        items.Default = nil
1322
                end
1323
                for value, name in pairs(items) do
1324
                        local enumItem = setmetatable({
1325
                                Enum = enum,
1326
                                Name = name,
1327
                                Value = value
1328
                        }, LuaEnum.enum_item_metatable)
1329
                        enumItemsByName[name] = enumItem
1330
                        enumItemsByValue[value] = enumItem
1331
                        if name == default or value == default then
1332
                                enum.Default = enumItem
1333
                        end
1334
                end
1335
                return setmetatable(enum, LuaEnum.enum_metatable)
1336
        end
1337
}
1338
function LuaEnum.new(name)
1339
        return setmetatable({name}, LuaEnum.init_metatable)
1340
end
1341
 
1342
Logger = {};
1343
 
1344
Logger.entries = {0}
1345
Logger.MessageType = LuaEnum.new "MessageType" {
1346
        "Output",
1347
        "Info",
1348
        "Warning",
1349
        "Severe",
1350
        "Error",
1351
        Default = "Severe"
1352
}
1353
Logger.MESSAGE_TYPE_SETTINGS = {
1354
        { -- Output
1355
                Font = "Arial",
1356
                TextColor3 = Color3.new(0, 0, 0)
1357
        },
1358
        { -- Info
1359
                Font = "Arial",
1360
                TextColor3 = Color3.new(0, 0, 1)
1361
        },
1362
        { -- Warning
1363
                Font = "ArialBold",
1364
                TextColor3 = Color3.new(1, 0.5, 0)
1365
        },
1366
        { -- Severe/Error
1367
                Font = "ArialBold",
1368
                TextColor3 = Color3.new(1, 0, 0)
1369
        }
1370
}
1371
Logger.MAX_ENTRIES = 160
1372
Logger.WARNING_TRACE_ITEM_COUNT = 5
1373
Logger.rbxPrint = getfenv(RbxUtility.CreateSignal).print
1374
function Logger.error(level, message)
1375
        message = message .. "\n" .. Logger.StackTraceToString(Logger.GenerateStackTrace(level + 1))
1376
        Logger.AddEntry {Logger.MessageType.Error, message}
1377
        error(level + 1, message)
1378
end
1379
function Logger.errorf(level, messageFormat, ...)
1380
        Logger.error(level + 1, string.format(messageFormat, ...))
1381
end
1382
function Logger.print(messageType, message, level)
1383
        messageType = Logger.MessageType(messageType)
1384
        local entry = {messageType, message}
1385
        Logger.rbxPrint(Logger.EntryToString(entry))
1386
        Logger.AddEntry(entry)
1387
        if level ~= false and messageType.Value >= Logger.MessageType.Warning.Value then
1388
                local maxItems
1389
                if messageType.Value >= Logger.MessageType.Severe.Value then
1390
                        maxItems = math.huge
1391
                else
1392
                        maxItems = Logger.WARNING_TRACE_ITEM_COUNT
1393
                end
1394
                local trace = Logger.GenerateStackTrace((level or 1) + 1, math.huge, 10, maxItems + 1)
1395
                local traceLength = #trace
1396
                local stackTraceMessage
1397
                local suffix = ""
1398
                if traceLength > maxItems then
1399
                        trace[traceLength] = nil
1400
                        suffix = "\n..."
1401
                end
1402
                Logger.print("Info", "Stack trace:\n" .. Logger.StackTraceToString(trace) .. suffix .. "\nStack end", false)
1403
        end
1404
end
1405
function Logger.printf(messageType, messageFormat, ...)
1406
        Logger.print(messageType, string.format(messageFormat, ...), 2)
1407
end
1408
function Logger.AddEntry(entry)
1409
        local entries = Logger.entries
1410
        if entries[1] >= Logger.MAX_ENTRIES then
1411
                local first = entries[2]
1412
                local nextFirst = first[2]
1413
                first[1] = nil
1414
                first[2] = nil
1415
                entries[1] = entries[1] - 1
1416
                entries[2] = nextFirst
1417
                if not nextFirst then
1418
                        entries[3] = nil
1419
                end
1420
        end
1421
        local last = entries[3]
1422
        local node = {entry}
1423
        if last then
1424
                entries[3] = node
1425
                last[2] = node
1426
        else
1427
                entries[2] = node
1428
                entries[3] = node
1429
        end
1430
        entries[1] = entries[1] + 1
1431
end
1432
function Logger.NodeIterator(list, node)
1433
        if node then
1434
                node = node[2]
1435
        else
1436
                node = list[2]
1437
        end
1438
        if node then
1439
                return node, node[1]
1440
        end
1441
end
1442
function Logger.EntryToString(entry)
1443
        local messageType, message = entry[1], tostring(entry[2])
1444
        if messageType and messageType.Value >= Logger.MessageType.Info.Value then
1445
                return messageType.Name .. ": " .. message
1446
        else
1447
                return message
1448
        end
1449
end
1450
function Logger.GenerateStackTrace(level, maxLevel, maxTailCalls, maxTraceItems)
1451
        level = level + 2
1452
        if maxLevel == nil then
1453
                maxLevel = math.huge
1454
        else
1455
                maxLevel = maxLevel + 2
1456
        end
1457
        maxTailCalls = maxTailCalls or 10
1458
        maxTraceItems = maxTraceItems or math.huge
1459
        local trace = {}
1460
        local numTailCalls = 0
1461
        while level <= maxLevel and numTailCalls <= maxTailCalls and #trace < maxTraceItems do
1462
                local success, errorMessage = xpcall(function() error("-", level + 1) end, function(...) return ... end)
1463
                if errorMessage == "-" then
1464
                        numTailCalls = numTailCalls + 1
1465
                else
1466
                        if numTailCalls > 0 then
1467
                                local traceSize = #trace
1468
                                if traceSize > 0 then
1469
                                        trace[#trace][3] = numTailCalls
1470
                                end
1471
                                numTailCalls = 0
1472
                        end
1473
                        local script, line = string.match(errorMessage, "(.*):(%d+)")
1474
                        trace[#trace + 1] = {script, tonumber(line), 0}
1475
                end
1476
                level = level + 1
1477
        end
1478
        return trace
1479
end
1480
function Logger.StackTraceToString(trace)
1481
        local buffer = {}
1482
        for _, data in ipairs(trace) do
1483
                buffer[#buffer + 1] = string.format("Script %q, line %d", data[1], data[2])
1484
                local numTailCalls = data[3]
1485
                if numTailCalls == 1 then
1486
                        buffer[#buffer + 1] = "... 1 tail call"
1487
                elseif numTailCalls > 1 then
1488
                        buffer[#buffer + 1] = string.format("... %d tail calls", numTailCalls)
1489
                end
1490
        end
1491
        return table.concat(buffer, "\n")
1492
end
1493
function Logger.MessageOutFunc(message, messageType)
1494
        if AdvancedGUI and AdvancedGUI.Print then
1495
                local messageTypeValue
1496
                if messageType == Enum.MessageType.MessageOutput then
1497
                        local tagName, untaggedMessage = string.match(message, "(%a+): (.*)")
1498
                        if tagName == "Info" or tagName == "Warning" or tagName == "Severe" then
1499
                                messageTypeValue = Logger.MessageType[tagName].Value
1500
                                message = untaggedMessage
1501
                        else
1502
                                messageTypeValue = Logger.MessageType.Output.Value
1503
                        end
1504
                else
1505
                        messageTypeValue = messageType.Value + 1
1506
                end
1507
                AdvancedGUI.PrintFormat(Logger.MESSAGE_TYPE_SETTINGS[messageTypeValue], message)
1508
        end
1509
end
1510
function print(...)
1511
        local args = {...}
1512
        local buffer = {}
1513
        for index = 1, select("#", ...) do
1514
                buffer[index] = tostring(args[index])
1515
        end
1516
        local message = table.concat(buffer, "\t")
1517
        Logger.print("Output", message)
1518
end
1519
 
1520
CharacterAppearance = {};
1521
 
1522
CharacterAppearance.defaultAppearanceId = 4
1523
CharacterAppearance.stock = {}
1524
function CharacterAppearance.Create(properties)
1525
        local id = properties.Id
1526
        local bodyColors = Instance.new("BodyColors")
1527
        bodyColors.HeadColor = properties.HeadColor
1528
        bodyColors.TorsoColor = properties.TorsoColor
1529
        bodyColors.RightArmColor = properties.RightArmColor
1530
        bodyColors.LeftArmColor = properties.LeftArmColor
1531
        bodyColors.RightLegColor = properties.RightLegColor
1532
        bodyColors.LeftLegColor = properties.LeftLegColor
1533
        local characterObjects = {bodyColors}
1534
        local headObjects = {} 
1535
        local data = {
1536
                characterObjects = characterObjects,
1537
                headObjects = headObjects,
1538
                tshirt = properties.TShirt
1539
        }
1540
        for _, assetId in ipairs(properties.CharacterAssets) do
1541
                TaskScheduler.Start(CharacterAppearance.LoadAsset, characterObjects, assetId)
1542
        end
1543
        for _, assetId in ipairs(properties.HeadAssets) do
1544
                TaskScheduler.Start(CharacterAppearance.LoadAsset, headObjects, assetId)
1545
        end
1546
        CharacterAppearance.stock[id] = data
1547
end
1548
function CharacterAppearance.GetDefaultAppearance()
1549
        return CharacterAppearance.stock[CharacterAppearance.defaultAppearanceId]
1550
end
1551
function CharacterAppearance.LoadAsset(objects, assetId)
1552
        local asset = InsertService:LoadAsset(assetId)
1553
        for _, child in ipairs(asset:GetChildren()) do
1554
                child.Archivable = true
1555
                table.insert(objects, child:Clone())
1556
        end
1557
end
1558
CharacterAppearance.Create {
1559
        Id = 1,
1560
        HeadColor = BrickColor.new("Institutional white"),
1561
        TorsoColor = BrickColor.new("Institutional white"),
1562
        RightArmColor = BrickColor.new("Institutional white"),
1563
        LeftArmColor = BrickColor.new("Institutional white"),
1564
        RightLegColor = BrickColor.new("Institutional white"),
1565
        LeftLegColor = BrickColor.new("Institutional white"),
1566
        CharacterAssets = {
1567
                90825058, 90825211,
1568
                27112056, 27112052,
1569
                27112039, 27112025,
1570
                27112068, 38322996
1571
        },
1572
        HeadAssets = {
1573
                20722130,
1574
                8330576
1575
        }
1576
}
1577
CharacterAppearance.Create {
1578
        Id = 2,
1579
        HeadColor = BrickColor.new("Institutional white"),
1580
        TorsoColor = BrickColor.new("Institutional white"),
1581
        RightArmColor = BrickColor.new("Institutional white"),
1582
        LeftArmColor = BrickColor.new("Institutional white"),
1583
        RightLegColor = BrickColor.new("Institutional white"),
1584
        LeftLegColor = BrickColor.new("Institutional white"),
1585
        CharacterAssets = {
1586
                90825058, 90825211,
1587
                11748356, 1029025,
1588
                1235488, 27112056,
1589
                27112052, 27112039,
1590
                27112025, 27112068
1591
        },
1592
        HeadAssets = {
1593
                20722130
1594
        }
1595
}
1596
CharacterAppearance.Create {
1597
        Id = 3,
1598
        HeadColor = BrickColor.new("Pastel brown"),
1599
        TorsoColor = BrickColor.new("Pastel brown"),
1600
        RightArmColor = BrickColor.new("Pastel brown"),
1601
        LeftArmColor = BrickColor.new("Pastel brown"),
1602
        RightLegColor = BrickColor.new("White"),
1603
        LeftLegColor = BrickColor.new("White"),
1604
        CharacterAssets = {
1605
                134289125, 48474356,
1606
                100339040, 46302558,
1607
                153955895
1608
        },
1609
        HeadAssets = {},
1610
        TShirt = "rbxassetid://148856353"
1611
}
1612
CharacterAppearance.Create {
1613
        Id = 4,
1614
        HeadColor = BrickColor.new("Pastel brown"),
1615
        TorsoColor = BrickColor.new("Pastel brown"),
1616
        RightArmColor = BrickColor.new("Pastel brown"),
1617
        LeftArmColor = BrickColor.new("Pastel brown"),
1618
        RightLegColor = BrickColor.new("White"),
1619
        LeftLegColor = BrickColor.new("White"),
1620
        CharacterAssets = {
1621
                129458426, 96678344, 184489190
1622
        },
1623
        HeadAssets = {},
1624
        TShirt = "rbxassetid://160146697"
1625
}
1626
 
1627
GraphicalEffects = {};
1628
 
1629
local MESH_IDS = {"rbxassetid://15310891"}
1630
local SOUND_IDS = {"rbxassetid://2248511", "rbxassetid://1369158"}
1631
local TEXTURE_IDS = {"rbxassetid://36527089", "rbxassetid://122610943", "rbxassetid://126561317", "rbxassetid://127033719"}
1632
local preloadConnections = {}
1633
local reloadingPreloads = false
1634
function GraphicalEffects.InitPreloads()
1635
        local preload_part = Instance.new("Part")
1636
        GraphicalEffects.preload_part = preload_part
1637
        preload_part.Anchored = true
1638
        preload_part.Archivable = false
1639
        preload_part.BottomSurface = "Smooth"
1640
        preload_part.CanCollide = false
1641
        preload_part.CFrame = CFrame.new(math.huge, math.huge, math.huge)
1642
        preload_part.FormFactor = "Custom"
1643
        preload_part.Locked = true
1644
        preload_part.Name = "Asset Preloader"
1645
        preload_part.Size = Vector3.new(0.2, 0.2, 0.2)
1646
        preload_part.TopSurface = "Smooth"
1647
        preload_part.Transparency = 1
1648
        preloadConnections[preload_part] = preload_part.AncestryChanged:connect(GraphicalEffects.PreloadsAncestryChanged)
1649
        for _, mesh_id in ipairs(MESH_IDS) do
1650
                local mesh = Instance.new("SpecialMesh")
1651
                mesh.MeshType = "FileMesh"
1652
                mesh.MeshId = mesh_id
1653
                preloadConnections[mesh] = mesh.AncestryChanged:connect(GraphicalEffects.PreloadsAncestryChanged)
1654
                mesh.Parent = preload_part
1655
        end
1656
        for _, sound_id in ipairs(SOUND_IDS) do
1657
                local sound = Instance.new("Sound")
1658
                sound.SoundId = sound_id
1659
                sound.Volume = 0
1660
                preloadConnections[sound] = sound.AncestryChanged:connect(GraphicalEffects.PreloadsAncestryChanged)
1661
                sound.Parent = preload_part
1662
        end
1663
        for _, texture_id in ipairs(TEXTURE_IDS) do
1664
                local decal = Instance.new("Decal")
1665
                decal.Texture = texture_id
1666
                preloadConnections[decal] = decal.AncestryChanged:connect(GraphicalEffects.PreloadsAncestryChanged)
1667
                decal.Parent = preload_part
1668
        end
1669
        preload_part.Parent = Workspace
1670
end
1671
function GraphicalEffects.PreloadsAncestryChanged(child, parent)
1672
        if not reloadingPreloads and parent ~= GraphicalEffects.preload_part and parent ~= Workspace then
1673
                reloadingPreloads = true
1674
                for _, connection in pairs(preloadConnections) do
1675
                        connection:disconnect()
1676
                        preloadConnections[_] = nil
1677
                end
1678
                wait(1)
1679
                reloadingPreloads = false
1680
                GraphicalEffects.InitPreloads()
1681
        end
1682
end
1683
GraphicalEffects.InitPreloads()
1684
-- Hyper beam
1685
function GraphicalEffects.FireSpaceHyperBeam(target, power, duration, radius, height, deviation)
1686
        local stepTime, gameTime = 1 / 30, TaskScheduler.GetCurrentTime()
1687
        local frames = duration * 30
1688
        local beamColorOffset = 0.75 * tick() -- math.random()
1689
        local blastPressure = power * 62500 + 250000
1690
        local beamPart = Instance.new("Part")
1691
        local beamMesh = Instance.new("SpecialMesh", beamPart)
1692
        local explosion = Instance.new("Explosion")
1693
        local sound = Instance.new("Sound", beamPart)
1694
        beamPart.Anchored = true
1695
        beamPart.CanCollide = false
1696
        beamPart.CFrame = CFrame.new(target, target + Vector3.new(deviation * (math.random() - 0.5), deviation * (math.random() - 0.5), height))
1697
        beamPart.FormFactor = "Custom"
1698
        beamPart.Locked = true
1699
        beamPart.Size = Vector3.new(0.2, 0.2, 0.2)
1700
        beamMesh.MeshId = "rbxassetid://15310891"
1701
        beamMesh.MeshType = "FileMesh"
1702
        beamMesh.TextureId = "rbxassetid://36527089"
1703
        local beamGlowPart1 = beamPart:Clone()
1704
        local beamGlowMesh1 = beamMesh:Clone()
1705
        local beamGlowPart2 = beamPart:Clone()
1706
        local beamGlowMesh2 = beamMesh:Clone()
1707
        local beamLight = Instance.new("PointLight", beamPart)
1708
        beamLight.Range = power * 2
1709
        beamLight.Shadows = true
1710
        explosion.BlastPressure = blastPressure
1711
        explosion.BlastRadius = power
1712
        explosion.Position = target
1713
        sound.SoundId = "rbxassetid://2248511"
1714
        sound.Volume = 1
1715
        local explosionHitConnection = explosion.Hit:connect(function(part, distance)
1716
                if not part.Anchored and part:GetMass() < power * power then
1717
                        pcall(part.BreakJoints, part)
1718
                        part.Color = Color3.new(Utility.GetRainbowRGB(1.5 * gameTime + beamColorOffset))
1719
                end
1720
        end)
1721
        beamPart.Transparency = 0.5
1722
        beamPart.Archivable = false
1723
        beamGlowPart1.Transparency = 0.75
1724
        beamGlowPart2.Transparency = 0.75
1725
        beamGlowMesh1.Parent = beamGlowPart1
1726
        beamGlowPart1.Parent = beamPart
1727
        beamGlowMesh2.Parent = beamGlowPart2
1728
        beamGlowPart2.Parent = beamPart
1729
        beamPart.Parent = workspace
1730
        explosion.Parent = workspace
1731
        for frame = 1, frames do
1732
                local progress = frame / frames
1733
                local alpha = 1 - math.sin(0.5 * math.pi * progress)
1734
                local scale = 0.4 * alpha
1735
                local glowScale1 = alpha * (0.5 + 0.5 * math.sin(math.tau * (8 * gameTime + beamColorOffset)))
1736
                local glowScale2 = alpha * (0.5 + 0.5 * math.cos(math.tau * (8 * gameTime + beamColorOffset)))
1737
                local vertexColor =  Vector3.new(Utility.GetRainbowRGB(1.5 * gameTime + beamColorOffset))
1738
                beamLight.Brightness = 1 - progress
1739
                beamLight.Color = Color3.new(vertexColor.x, vertexColor.y, vertexColor.z)
1740
                beamMesh.Scale = Vector3.new(radius * scale, 9000, radius * scale)
1741
                beamMesh.VertexColor = vertexColor
1742
                beamGlowMesh1.Scale = Vector3.new(1.2 * radius * glowScale1, 9000, 1.2 * radius * glowScale1)
1743
                beamGlowMesh1.VertexColor = vertexColor
1744
                beamGlowMesh2.Scale = Vector3.new(1.2 * radius * glowScale2, 9000, 1.2 * radius * glowScale2)
1745
                beamGlowMesh2.VertexColor = vertexColor
1746
                RunService.Stepped:wait()
1747
                gameTime = TaskScheduler.GetCurrentTime()
1748
                if frame <= 2 then
1749
                        local explosion = Instance.new("Explosion")
1750
                        explosion.BlastPressure = (1 - progress) * blastPressure
1751
                        explosion.BlastRadius = (1 - progress) * power
1752
                        explosion.Position = target
1753
                        explosion.Parent = Workspace
1754
                        if frame == 2 then
1755
                                sound:Play()
1756
                        end
1757
                end
1758
        end
1759
        pcall(beamPart.Destroy, beamPart)
1760
        explosionHitConnection:disconnect()
1761
end
1762
function GraphicalEffects.SpaceHyperBeam(target, power, duration, radius, height, deviation)
1763
        TaskScheduler.Start(GraphicalEffects.FireSpaceHyperBeam, target, power or 12, duration or 1.5, radius or 6, height or 600, deviation or 20)
1764
end
1765
 
1766
function GraphicalEffects.CrystalRing(data)
1767
        data = data or {}
1768
        local crystal_count = data.crystal_count or 10
1769
        local crystal_color = data.crystal_color or BrickColor.new("Bright red")
1770
        local crystal_scale = data.crystal_scale or Vector3.new(2 / 3, 2, 2 / 3)
1771
        local fade_out_color = data.fade_out_color or BrickColor.new("Really black")
1772
        local radius = radius or 1.25 * crystal_count / math.pi
1773
        local spawn_duration = data.spawn_duration or 0.065
1774
        local full_spawn_duration = spawn_duration * crystal_count
1775
        local float_duration = data.float_duration or 5
1776
        local wave_amplitude = data.wave_amplitude or 0.5
1777
        local wave_period = data.wave_period or 1
1778
        local appear_duration = data.appear_duration or 0.1
1779
        local disappear_duration = data.disappear_duration or 0.5
1780
        local base_part = data.base_part
1781
        local offset_cframe
1782
        if data.position then
1783
                offset_cframe = CFrame.new(data.position)
1784
                if base_part then
1785
                        offset_cframe = base_part.CFrame:toObjectSpace(offset_cframe)
1786
                end
1787
        else
1788
                offset_cframe = CFrame.new()
1789
        end
1790
        local crystal_template = Instance.new("Part")
1791
        crystal_template.Anchored = true
1792
        crystal_template.Locked = true
1793
        crystal_template.CanCollide = false
1794
        crystal_template.BottomSurface = "Smooth"
1795
        crystal_template.TopSurface = "Smooth"
1796
        crystal_template.BrickColor = crystal_color
1797
        crystal_template.FormFactor = "Symmetric"
1798
        crystal_template.Size = Vector3.new(1, 1, 1)
1799
        local crystal_light = Instance.new("PointLight", crystal_template)
1800
        crystal_light.Brightness = 0.1 / crystal_count
1801
        crystal_light.Color = crystal_color.Color
1802
        crystal_light.Name = "Light"
1803
        crystal_light.Range = radius
1804
        crystal_light.Shadows = true
1805
        local crystal_mesh = Instance.new("SpecialMesh", crystal_template)
1806
        crystal_mesh.MeshId = "rbxassetid://9756362"
1807
        crystal_mesh.MeshType = "FileMesh"
1808
        crystal_mesh.Name = "Mesh"
1809
        crystal_mesh.Scale = crystal_scale
1810
        local crystal_model = Instance.new("Model")
1811
        crystal_model.Archivable = false
1812
        crystal_model.Name = "Crystal Model"
1813
        crystal_model.Parent = Workspace
1814
        local crystals = {}
1815
        local lights = {}
1816
        local meshes = {}
1817
        for index = 1, crystal_count do
1818
                local crystal = crystal_template:Clone()
1819
                crystal.Parent = crystal_model
1820
                crystals[index] = crystal
1821
                lights[index] = crystal.Light
1822
                meshes[index] = crystal.Mesh
1823
        end
1824
        local start_time = tick()
1825
        repeat
1826
                local base_cframe = offset_cframe
1827
                if base_part then
1828
                        base_cframe = base_part.CFrame * base_cframe
1829
                end
1830
                local elapsed_time = tick() - start_time
1831
                for index, crystal in ipairs(crystals) do
1832
                        local crystal_time = elapsed_time - index * spawn_duration
1833
                        local disappear_time = crystal_time - float_duration
1834
                        local offset
1835
                        if crystal_time < 0 then
1836
                                offset = 0
1837
                        elseif crystal_time < appear_duration then
1838
                                offset = radius * crystal_time / appear_duration
1839
                        else
1840
                                offset = radius
1841
                        end
1842
                        local wave_offset
1843
                        if disappear_time >= 0 then
1844
                                local disappear_progress = disappear_time / disappear_duration
1845
                                if disappear_progress > 1 then
1846
                                        if crystal.Parent then
1847
                                                crystal:Destroy()
1848
                                        end
1849
                                else
1850
                                        local inverse_progress = 1 - disappear_progress
1851
                                        local light = lights[index]
1852
                                        local mesh = meshes[index]
1853
                                        crystal.BrickColor = fade_out_color
1854
                                        light.Brightness = 2 * inverse_progress
1855
                                        light.Range = 2 * radius
1856
                                        mesh.Scale = crystal_scale * inverse_progress
1857
                                end
1858
                                wave_offset = 0
1859
                        else
1860
                                wave_offset = wave_amplitude * math.sin(math.tau * (elapsed_time - index / crystal_count * 3) / wave_period)
1861
                        end
1862
                        local rotation_angle = (tick() * 0.5 + (index - 1) / crystal_count) % 1 * math.tau
1863
                        crystal.CFrame = base_cframe * CFrame.Angles(0, rotation_angle, 0) * CFrame.new(0, wave_offset, -offset)
1864
                end
1865
                RunService.Stepped:wait()
1866
        until elapsed_time >= float_duration + full_spawn_duration + disappear_duration
1867
        if crystal_model.Parent then
1868
                crystal_model:Destroy()
1869
        end
1870
end
1871
 
1872
GraphicalEffects.magicCircleData = {}
1873
GraphicalEffects.MAGIC_CIRCLE_DEFAULT_OFFSET = 6.25
1874
function GraphicalEffects.AnimateMagicCircle(data)
1875
        local frame, direction, magic_circle_model, magic_circle_part, magic_circle_light, magic_circle_decal_back, magic_circle_decal_front, duration,
1876
 
1877
stay, magic_circle_adornee_func, magic_circle_offset = unpack(data)
1878
        frame = frame + 1
1879
        data[1] = frame
1880
        local transparency = (frame / duration) ^ stay
1881
        local opacity = 1 - transparency
1882
        if frame == duration then
1883
                pcall(Game.Destroy, magic_circle_model)
1884
                GraphicalEffects.magicCircleData[data] = nil
1885
        else
1886
                if magic_circle_model.Parent ~= Workspace then
1887
                        pcall(Utility.SetProperty, magic_circle_model, "Parent", Workspace)
1888
                end
1889
                local magic_circle_adornee = magic_circle_adornee_func()
1890
                magic_circle_position = magic_circle_adornee.Position + direction * magic_circle_offset
1891
                local magic_circle_cframe = CFrame.new(magic_circle_position, magic_circle_position + direction) * CFrame.Angles(0, 0, math.tau * frame /
1892
 
1893
25)
1894
                magic_circle_part.CFrame = magic_circle_cframe
1895
                magic_circle_light.Brightness = opacity
1896
                magic_circle_decal_back.Transparency = transparency
1897
                magic_circle_decal_front.Transparency = transparency
1898
        end
1899
end
1900
function GraphicalEffects.CreateMagicCircle(target, magic_circle_scale, magic_circle_image, light_color, duration, stay, magic_circle_adornee_func,
1901
 
1902
magic_circle_offset)
1903
        local magic_circle_adornee = magic_circle_adornee_func()
1904
        if magic_circle_adornee then
1905
                local origin = magic_circle_adornee.Position
1906
                local direction = (target - origin).unit
1907
                local magic_circle_position = origin + direction * magic_circle_offset
1908
                local magic_circle_cframe = CFrame.new(magic_circle_position, magic_circle_position + direction)
1909
                local magic_circle_model = Instance.new("Model")
1910
                local magic_circle_part = Instance.new("Part", magic_circle_model)
1911
                local magic_circle_mesh = Instance.new("BlockMesh", magic_circle_part)
1912
                local magic_circle_light = Instance.new("PointLight", magic_circle_part)
1913
                local magic_circle_decal_back = Instance.new("Decal", magic_circle_part)
1914
                local magic_circle_decal_front = Instance.new("Decal", magic_circle_part)
1915
                magic_circle_model.Archivable = false
1916
                magic_circle_part.Anchored = true
1917
                magic_circle_part.BottomSurface = "Smooth"
1918
                magic_circle_part.CanCollide = false
1919
                magic_circle_part.CFrame = magic_circle_cframe
1920
                magic_circle_part.FormFactor = "Custom"
1921
                magic_circle_part.Locked = true
1922
                magic_circle_part.Size = Vector3.new(0.2, 0.2, 0.2)
1923
                magic_circle_part.TopSurface = "Smooth"
1924
                magic_circle_part.Transparency = 1
1925
                magic_circle_mesh.Scale = Vector3.new(60, 60, 0) * magic_circle_scale
1926
                magic_circle_light.Color = light_color
1927
                magic_circle_light.Range = 16 * magic_circle_scale
1928
                magic_circle_light.Shadows = true
1929
                magic_circle_decal_back.Face = "Back"
1930
                magic_circle_decal_back.Texture = magic_circle_image
1931
                magic_circle_decal_front.Face = "Front"
1932
                magic_circle_decal_front.Texture = magic_circle_image
1933
                magic_circle_model.Parent = Workspace
1934
                local data = {0, direction, magic_circle_model, magic_circle_part, magic_circle_light, magic_circle_decal_back, magic_circle_decal_front,
1935
 
1936
duration, stay, magic_circle_adornee_func, magic_circle_offset}
1937
                GraphicalEffects.magicCircleData[data] = true
1938
                return data
1939
        end
1940
end
1941
 
1942
GraphicalEffects.missileData = {}
1943
GraphicalEffects.missileParts = {}
1944
function GraphicalEffects.AnimateMissile(data)
1945
        local frame, missilePart, targetPart, timeCreated, direction, touchedConnection, explodeRequested, bodyGyro, swooshSound, magicCircleData, lifeTime,
1946
 
1947
pointOnPart, flipped = unpack(data)
1948
        frame = frame + 1
1949
        data[1] = frame
1950
        if flipped then
1951
                direction = -direction
1952
        end
1953
        if frame <= 10 then
1954
                if frame == 2 then
1955
                        swooshSound:Play()
1956
                end
1957
                missilePart.Anchored = true
1958
                local progress = frame / 10
1959
                missilePart.Size = Vector3.new(1, 1, progress * 4)
1960
                local magicCirclePart = magicCircleData[4]
1961
                local magicCirclePosition = magicCirclePart.Position
1962
                local missileOffset = 2 * progress * direction
1963
                local missilePosition = magicCirclePosition + missileOffset
1964
                missilePart.CFrame = CFrame.new(missilePosition, missilePosition + direction)
1965
                --missilePart.Transparency = 0.5 * (1 - progress)
1966
                if frame == 10 then
1967
                        touchedConnection = missilePart.Touched:connect(function(hit)
1968
                                if hit.CanCollide and hit.Parent and not GraphicalEffects.missileParts[hit] then
1969
                                        touchedConnection:disconnect()
1970
                                        data[7] = true
1971
                                end
1972
                        end)
1973
                        data[6] = touchedConnection
1974
                end
1975
        else
1976
                missilePart.Anchored = false
1977
                local missilePosition = missilePart.Position
1978
                local targetPosition = targetPart.CFrame * pointOnPart
1979
                local distanceVector = targetPosition - missilePosition
1980
                local elapsedTime = time() - timeCreated
1981
                local targetParent = targetPart.Parent
1982
                if explodeRequested or (targetParent and distanceVector.magnitude < 10) or elapsedTime > lifeTime then
1983
                        GraphicalEffects.missileData[data] = nil
1984
                        GraphicalEffects.missileParts[missilePart] = nil
1985
                        touchedConnection:disconnect()
1986
                        if missilePart.Parent then
1987
                                missilePart:Destroy()
1988
                                local explosion = Instance.new("Explosion")
1989
                                explosion.BlastRadius = 12.5
1990
                                explosion.Position = missilePosition
1991
                                local explosionHitConnection = explosion.Hit:connect(function(hit, distance)
1992
                                        local missileData = GraphicalEffects.missileParts[hit]
1993
                                        if missileData and distance < 3 then
1994
                                                missileData[7] = true
1995
                                        else
1996
                                                pcall(hit.BreakJoints, hit)
1997
                                        end
1998
                                end)
1999
                                explosion.Parent = Workspace
2000
                                TaskScheduler.Schedule(1, explosionHitConnection.disconnect, explosionHitConnection)
2001
                        end
2002
                else
2003
                        local targetInWorkspace = targetPart:IsDescendantOf(Workspace)
2004
                        if targetInWorkspace then
2005
                                direction = distanceVector.unit
2006
                                data[5] = direction
2007
                        end
2008
                        local speed = 14 + elapsedTime * 10
2009
                        local gyroD
2010
                        if elapsedTime < 42.5 and targetInWorkspace then
2011
                                gyroD = 1000 - elapsedTime * 15
2012
                        else
2013
                                gyroD = 100
2014
                                bodyGyro.maxTorque = Vector3.new(0, 0, 0)
2015
                                if elapsedTime + 7.5 < lifeTime then
2016
                                        data[11] = elapsedTime + 7.5
2017
                                end
2018
                        end
2019
                        bodyGyro.D = gyroD
2020
                        bodyGyro.cframe = CFrame.new(Vector3.new(), direction)
2021
                        missilePart.Velocity = missilePart.CFrame.lookVector * speed
2022
                end
2023
        end
2024
end
2025
function GraphicalEffects.ShootMissile(targetPart, pointOnPart, direction, magic_circle_adornee_func, magic_circle_offset, flipped)
2026
        if not magic_circle_offset then
2027
                magic_circle_offset = GraphicalEffects.MAGIC_CIRCLE_DEFAULT_OFFSET
2028
        end
2029
        local targetPosition = targetPart.Position
2030
        local headPosition = chatAdornee.Position
2031
        local origin = CFrame.new(headPosition, headPosition + direction) + direction * magic_circle_offset
2032
        local missilePart = Instance.new("Part")
2033
        local antiGravityForce = Instance.new("BodyForce", missilePart)
2034
        local bodyGyro = Instance.new("BodyGyro", missilePart)
2035
        local explosionSound = Instance.new("Sound", missilePart)
2036
        local swooshSound = Instance.new("Sound", missilePart)
2037
        antiGravityForce.force = Vector3.new(0, 196.2 * 4, 0)
2038
        bodyGyro.D = 1000
2039
        bodyGyro.maxTorque = Vector3.new(1, 1, 1)
2040
        explosionSound.PlayOnRemove = true
2041
        explosionSound.SoundId = "rbxasset://sounds/collide.wav"
2042
        explosionSound.Volume = 1
2043
        missilePart.Anchored = true
2044
        missilePart.BackSurface = "Studs"
2045
        missilePart.BottomSurface = "Studs"
2046
        missilePart.BrickColor = BrickColor.Red()
2047
        missilePart.CFrame = origin
2048
        missilePart.FormFactor = "Custom"
2049
        missilePart.FrontSurface = "Studs"
2050
        missilePart.LeftSurface = "Studs"
2051
        missilePart.Locked = true
2052
        missilePart.RightSurface = "Studs"
2053
        missilePart.Size = Vector3.new(1, 1, 0.2)
2054
        missilePart.TopSurface = "Studs"
2055
        --missilePart.Transparency = 0.5
2056
        swooshSound.Looped = true
2057
        swooshSound.SoundId = "rbxasset://sounds/Rocket whoosh 01.wav"
2058
        swooshSound.Volume = 0.7
2059
        local magicCircleData = GraphicalEffects.CreateMagicCircle(headPosition + direction * 1000, 0.875, "rbxassetid://127033719", Color3.new(1, 1, 1),
2060
 
2061
40, 4, magic_circle_adornee_func or function() return chatAdornee end, magic_circle_offset)
2062
        local data = {0, missilePart, targetPart, time(), direction, false, false, bodyGyro, swooshSound, magicCircleData, 50, pointOnPart, flipped}
2063
        missilePart.Parent = Workspace
2064
        GraphicalEffects.missileData[data] = true
2065
        GraphicalEffects.missileParts[missilePart] = data
2066
end
2067
 
2068
function GraphicalEffects.CubicInterpolate(y0, y1, y2, y3, mu)
2069
        local a0, a1, a2, a3, mu2
2070
        mu2 = mu * mu
2071
        a0 = y3 - y2 - y0 + y1
2072
        a1 = y0 - y1 - a0
2073
        a2 = y2 - y0
2074
        a3 = y1
2075
        return a0 * mu * mu2 + a1 * mu2 + a2 * mu + a3
2076
end
2077
function GraphicalEffects.JointCrap(model, cycletime)
2078
        if model then
2079
                local cycletime = cycletime or (0.75 * (1 + math.random() * 4))
2080
                local offsetradius = 0.75
2081
                local rotationoffset = math.pi
2082
                local joints = {}
2083
                local stack = model:GetChildren()
2084
                while #stack ~= 0 do
2085
                        local object = stack[#stack]
2086
                        table.remove(stack)
2087
                        for index, child in ipairs(object:GetChildren()) do
2088
                                table.insert(stack, child)
2089
                        end
2090
                        if object:IsA("JointInstance") then
2091
                                table.insert(joints, object)
2092
                        end
2093
                end
2094
                local rot0 = {}
2095
                local rot1 = {}
2096
                local rot2 = {}
2097
                local rot3 = {}
2098
                local rot4 = {}
2099
                for index, joint in ipairs(joints) do
2100
                        local pos = Vector3.new(math.random() - 0.5, math.random() - 0.5, math.random() - 0.5).unit * offsetradius
2101
                        local rot = Vector3.new(math.random(), math.random(), math.random()) * rotationoffset
2102
                        rot0[index] = {joint.C0, joint.C1}
2103
                        rot = Vector3.new(rot.x % (math.tau), rot.y % (math.tau), rot.z % (math.tau))
2104
                        rot2[index] = {pos, rot}
2105
                        pos = Vector3.new(math.random() - 0.5, math.random() - 0.5, math.random() - 0.5).unit * offsetradius
2106
                        rot = rot + Vector3.new(math.random(), math.random(), math.random()) * rotationoffset
2107
                        rot = Vector3.new(rot.x % (math.tau), rot.y % (math.tau), rot.z % (math.tau))
2108
                        rot3[index] = {pos, rot}
2109
                        pos = Vector3.new(math.random() - 0.5, math.random() - 0.5, math.random() - 0.5).unit * offsetradius
2110
                        rot = rot + Vector3.new(math.random(), math.random(), math.random()) * rotationoffset
2111
                        rot = Vector3.new(rot.x % (math.tau), rot.y % (math.tau), rot.z % (math.tau))
2112
                        rot4[index] = {pos, rot}
2113
                end
2114
                while model.Parent do
2115
                        for i, j in ipairs(joints) do
2116
                                local pos = Vector3.new(math.random() - 0.5, math.random() - 0.5, math.random() - 0.5).unit * offsetradius
2117
                                local rot = rot4[i][2] + Vector3.new(math.random(), math.random(), math.random()) * rotationoffset
2118
                                rot = Vector3.new(rot.x % (math.tau), rot.y % (math.tau), rot.z % (math.tau))
2119
                                rot1[i], rot2[i], rot3[i], rot4[i] = rot2[i], rot3[i], rot4[i], {pos, rot}
2120
                        end
2121
                        local start = tick()
2122
                        while true do
2123
                                local ctime = tick()
2124
                                local elapsed = ctime - start
2125
                                if elapsed > cycletime then
2126
                                        break
2127
                                end
2128
                                local progress = elapsed / cycletime
2129
                                for index, joint in ipairs(joints) do
2130
                                        local v0, v1, v2, v3, v4 = rot0[index], rot1[index], rot2[index], rot3[index], rot4[index]
2131
                                        local p1, p2, p3, p4, r1, r2, r3, r4 = v1[1], v2[1], v3[1], v4[1], v1[2], v2[2], v3[2], v4[2]
2132
                                        local px = GraphicalEffects.CubicInterpolate(p1.x, p2.x, p3.x, p4.x, progress)
2133
                                        local py = GraphicalEffects.CubicInterpolate(p1.y, p2.y, p3.y, p4.y, progress)
2134
                                        local pz = GraphicalEffects.CubicInterpolate(p1.z, p2.z, p3.z, p4.z, progress)
2135
                                        local rx = GraphicalEffects.CubicInterpolate(r1.x, r2.x, r3.x, r4.x, progress)
2136
                                        local ry = GraphicalEffects.CubicInterpolate(r1.y, r2.y, r3.y, r4.y, progress)
2137
                                        local rz = GraphicalEffects.CubicInterpolate(r1.z, r2.z, r3.z, r4.z, progress)
2138
                                        local cframe = CFrame.new(px, py, pz) * CFrame.Angles(rx, ry, rz)
2139
                                        joint.C0 = v0[1] * cframe
2140
                                        joint.C1 = v0[2] * cframe:inverse()
2141
                                end
2142
                                RunService.Stepped:wait()
2143
                        end
2144
                end
2145
        end
2146
end
2147
 
2148
GraphicalEffects.LASER_WIDTH = 0.15
2149
GraphicalEffects.LASER_MAGIC_CIRCLE_DISTANCE = 6.25
2150
GraphicalEffects.laser_data = {}
2151
--GraphicalEffects.fragmentation = {}
2152
function GraphicalEffects.AnimateLaserOfDeath(data)
2153
        local frame, directionOrientation, direction, magic_circle_model, laser_part, laser_mesh, magic_circle_part, magic_circle_light,
2154
 
2155
magic_circle_decal_back, magic_circle_decal_front, sound, laser_scale, fragmentation_size, duration, laser_lights, laser_effects, stay, light_effects =
2156
 
2157
unpack(data)
2158
        local laser_color = laser_part.Color
2159
        frame = frame + 1
2160
        data[1] = frame
2161
        local transparency = (frame / duration) ^ stay
2162
        local opacity = 1 - transparency
2163
        if frame == 2 then
2164
                sound:Play()
2165
        end
2166
        if frame == duration then
2167
                pcall(Game.Destroy, magic_circle_model)
2168
                GraphicalEffects.laser_data[data] = nil
2169
        else
2170
                if magic_circle_model.Parent ~= Workspace then
2171
                        pcall(Utility.SetProperty, magic_circle_model, "Parent", Workspace)
2172
                end
2173
                local laser_distance = 0
2174
                local origin = chatAdornee.CFrame
2175
                if not light_effects then
2176
                        direction = (origin * directionOrientation - origin.p).unit
2177
                end
2178
                local magic_circle_position = origin.p + direction * GraphicalEffects.LASER_MAGIC_CIRCLE_DISTANCE
2179
                local magic_circle_cframe = CFrame.new(magic_circle_position, magic_circle_position + direction) * CFrame.Angles(0, 0, math.tau * frame /
2180
 
2181
25)
2182
                local loop_scale = (laser_scale - 1) / 10
2183
                for x_offset = -loop_scale, loop_scale, 2 do
2184
                        for y_offset = -loop_scale, loop_scale, 2 do
2185
                                local origin_position = magic_circle_cframe * Vector3.new(x_offset, y_offset, 0)
2186
                                for index = 1, 8 do
2187
                                        local part, position
2188
                                        for ray_index = 1, 10 do
2189
                                                local ray = Ray.new(origin_position + direction * (999 * (ray_index - 1)), direction * 999)
2190
                                                part, position = Workspace:FindPartOnRay(ray, magic_circle_model)
2191
                                                if part then
2192
                                                        break
2193
                                                end
2194
                                        end
2195
                                        if part then
2196
                                                laser_distance = (position - origin_position).magnitude
2197
                                                if frame % 8 == 1 and index == 1 then
2198
                                                        Instance.new("Explosion", Workspace).Position = position
2199
                                                end
2200
                                                if not part:IsA("Terrain") then
2201
                                                        pcall(part.BreakJoints, part)
2202
                                                        local is_block = part:IsA("Part") and part.Shape == Enum.PartType.Block
2203
                                                        local mass = part:GetMass()
2204
                                                        local size = part.Size
2205
                                                        if (is_block and ((size.X < fragmentation_size and size.Y < fragmentation_size and size.Z <
2206
 
2207
fragmentation_size) or (not part.Anchored and mass < 750))) or (not is_block and mass < 250000) then
2208
                                                                local part_transparency = math.max(part.Transparency + 0.007 * fragmentation_size, 0.5)
2209
                                                                if part_transparency >= 0.5 then -- temporarily to minimize debris
2210
                                                                        pcall(Game.Destroy, part)
2211
                                                                else
2212
                                                                        local cframe = part.CFrame
2213
                                                                        part.Anchored = false
2214
                                                                        part.BrickColor = BrickColor.new("Medium stone grey")
2215
                                                                        part.CanCollide = true
2216
                                                                        if part:IsA("FormFactorPart") then
2217
                                                                                part.FormFactor = "Custom"
2218
                                                                        end
2219
                                                                        part.Size = size - Vector3.new(0.135, 0.135, 0.135) * fragmentation_size
2220
                                                                        part.Transparency = part_transparency
2221
                                                                        part.CFrame = cframe + direction * 5
2222
                                                                        part.Velocity = part.Velocity + direction * 40
2223
                                                                end
2224
                                                        elseif is_block then
2225
                                                                local parts = {part}
2226
                                                                local model = Instance.new("Model", part.Parent)
2227
                                                                model.Name = "Fragments"
2228
                                                                if size.X >= fragmentation_size then
2229
                                                                        size = Vector3.new(0.5, 1, 1) * size
2230
                                                                        local archivable = part.Archivable
2231
                                                                        local cframe = part.CFrame
2232
                                                                        part.FormFactor = "Custom"
2233
                                                                        part.Size = size
2234
                                                                        part.Archivable = true
2235
                                                                        local part_clone = part:Clone()
2236
                                                                        part.Archivable = archivable
2237
                                                                        part_clone.Archivable = archivable
2238
                                                                        part.CFrame = cframe * CFrame.new(-0.5 * size.X, 0, 0)
2239
                                                                        part_clone.CFrame = cframe * CFrame.new(0.5 * size.X, 0, 0)
2240
                                                                        part_clone.Parent = model
2241
                                                                        parts[2] = part_clone
2242
                                                                end
2243
                                                                if size.Y >= fragmentation_size then
2244
                                                                        size = Vector3.new(1, 0.5, 1) * size
2245
                                                                        for part_index = 1, #parts do
2246
                                                                                local part = parts[part_index]
2247
                                                                                local archivable = part.Archivable
2248
                                                                                local cframe = part.CFrame
2249
                                                                                part.FormFactor = "Custom"
2250
                                                                                part.Size = size
2251
                                                                                part.Archivable = true
2252
                                                                                local part_clone = part:Clone()
2253
                                                                                part.Archivable = archivable
2254
                                                                                part_clone.Archivable = archivable
2255
                                                                                part.CFrame = cframe * CFrame.new(0, -0.5 * size.Y, 0)
2256
                                                                                part_clone.CFrame = cframe * CFrame.new(0, 0.5 * size.Y, 0)
2257
                                                                                part_clone.Parent = model
2258
                                                                                table.insert(parts, part_clone)
2259
                                                                        end
2260
                                                                end
2261
                                                                if size.Z >= fragmentation_size then
2262
                                                                        size = Vector3.new(1, 1, 0.5) * size
2263
                                                                        for part_index = 1, #parts do
2264
                                                                                local part = parts[part_index]
2265
                                                                                local archivable = part.Archivable
2266
                                                                                local cframe = part.CFrame
2267
                                                                                part.FormFactor = "Custom"
2268
                                                                                part.Size = size
2269
                                                                                part.Archivable = true
2270
                                                                                local part_clone = part:Clone()
2271
                                                                                part.Archivable = archivable
2272
                                                                                part_clone.Archivable = archivable
2273
                                                                                part.CFrame = cframe * CFrame.new(0, 0, -0.5 * size.Z)
2274
                                                                                part_clone.CFrame = cframe * CFrame.new(0, 0, 0.5 * size.Z)
2275
                                                                                part_clone.Parent = model
2276
                                                                                table.insert(parts, part_clone)
2277
                                                                        end
2278
                                                                end
2279
                                                                for _, part in ipairs(parts) do
2280
                                                                        part:MakeJoints()
2281
                                                                end
2282
                                                        else
2283
                                                                break
2284
                                                        end
2285
                                                end
2286
                                        else
2287
                                                laser_distance = 9990
2288
                                                break
2289
                                        end
2290
                                end
2291
                        end
2292
                end
2293
                local laser_cframe = magic_circle_cframe * CFrame.Angles(-0.5 * math.pi, 0, 0)
2294
                local laser_width = GraphicalEffects.LASER_WIDTH * opacity * laser_scale
2295
                local laser_mesh_offset = Vector3.new(0, 0.5 * laser_distance, 0)      
2296
                laser_part.CFrame = laser_cframe
2297
                if laser_effects then
2298
                        local laser_effect_data_1, laser_effect_data_2 = laser_effects[1], laser_effects[2]
2299
                        local laser_effect_1, laser_effect_mesh_1 = laser_effect_data_1[1], laser_effect_data_1[2]
2300
                        local laser_effect_2, laser_effect_mesh_2 = laser_effect_data_2[1], laser_effect_data_2[2]
2301
                        laser_effect_1.CFrame = laser_cframe
2302
                        laser_effect_2.CFrame = laser_cframe
2303
                        laser_effect_mesh_1.Offset = laser_mesh_offset
2304
                        laser_effect_mesh_2.Offset = laser_mesh_offset
2305
                        local game_time = time()
2306
                        local effect_scale_1 = 0.5 + 0.5 * math.sin(16 * math.pi * game_time)
2307
                        local effect_scale_2 = 0.5 + 0.5 * math.cos(16 * math.pi * game_time)
2308
                        laser_effect_mesh_1.Scale = 5 * Vector3.new(laser_width * effect_scale_1, laser_distance, laser_width * effect_scale_1)
2309
                        laser_effect_mesh_2.Scale = 5 * Vector3.new(laser_width * effect_scale_2, laser_distance, laser_width * effect_scale_2)
2310
                        laser_width = laser_width * 0.25
2311
                end
2312
                laser_mesh.Offset = laser_mesh_offset                  
2313
                laser_mesh.Scale = 5 * Vector3.new(laser_width, laser_distance, laser_width)
2314
                magic_circle_part.CFrame = magic_circle_cframe
2315
                magic_circle_light.Brightness = opacity
2316
                magic_circle_decal_back.Transparency = transparency
2317
                magic_circle_decal_front.Transparency = transparency
2318
                if light_effects then
2319
                        for index, data in ipairs(laser_lights) do
2320
                                local laser_spotlight_part, laser_spotlight = data[1], data[2]
2321
                                local laser_spotlight_offset = 30 * (index - 1)
2322
                                if laser_spotlight_offset <= laser_distance then
2323
                                        laser_spotlight_part.CFrame = magic_circle_cframe * CFrame.new(0, 0, -laser_spotlight_offset)
2324
                                        laser_spotlight.Brightness = opacity
2325
                                        laser_spotlight.Enabled = true
2326
                                else
2327
                                        laser_spotlight.Enabled = false
2328
                                end
2329
                        end
2330
                end
2331
        end
2332
end
2333
function GraphicalEffects.ShootLaserOfDeath(target, data)
2334
        if chatAdornee then
2335
                data = data or {}
2336
                local brickcolor = data.brickcolor or BrickColor.new("Really black")
2337
                local duration = data.duration or 40
2338
                local fragmentation_size = data.fragmentation_size or 3
2339
                local laser_scale = data.laser_scale or 1
2340
                local light_color = data.light_color or Color3.new(1, 0.5, 1)
2341
                local magic_circle_image = data.magic_circle_image or "rbxassetid://122610943"
2342
                local magic_circle_scale = data.magic_circle_scale or 1
2343
                local sound_volume = data.sound_volume or 1 / 3
2344
                local special_effects = data.special_effects
2345
                local stay = data.stay or 4
2346
                local origin = chatAdornee.CFrame
2347
                local directionOrientation = origin:pointToObjectSpace(target)
2348
                local direction = (target - origin.p).unit
2349
                local magic_circle_position = origin.p + direction * GraphicalEffects.LASER_MAGIC_CIRCLE_DISTANCE
2350
                local magic_circle_cframe = CFrame.new(magic_circle_position, magic_circle_position + direction)
2351
                local magic_circle_model = Instance.new("Model")
2352
                local laser_part = Instance.new("Part", magic_circle_model)
2353
                local laser_mesh = Instance.new("CylinderMesh", laser_part)
2354
                local magic_circle_part = Instance.new("Part", magic_circle_model)
2355
                local magic_circle_mesh = Instance.new("BlockMesh", magic_circle_part)
2356
                local magic_circle_light = Instance.new("PointLight", magic_circle_part)
2357
                local magic_circle_decal_back = Instance.new("Decal", magic_circle_part)
2358
                local magic_circle_decal_front = Instance.new("Decal", magic_circle_part)
2359
                local sound = Instance.new("Sound", magic_circle_part)
2360
                sound.Pitch = 1.25
2361
                sound.SoundId = "rbxassetid://2248511"
2362
                sound.Volume = sound_volume
2363
                magic_circle_model.Archivable = false
2364
                laser_part.Anchored = true
2365
                laser_part.BottomSurface = "Smooth"
2366
                laser_part.BrickColor = brickcolor
2367
                laser_part.CanCollide = false
2368
                laser_part.CFrame = magic_circle_cframe * CFrame.Angles(-0.5 * math.pi, 0, 0)
2369
                laser_part.FormFactor = "Custom"
2370
                laser_part.Locked = true
2371
                laser_part.Size = Vector3.new(0.2, 0.2, 0.2)
2372
                laser_part.TopSurface = "Smooth"
2373
                laser_mesh.Offset = Vector3.new(0, 0, 0)
2374
                laser_mesh.Name = "Mesh"
2375
                laser_mesh.Scale = 5 * laser_scale * Vector3.new(GraphicalEffects.LASER_WIDTH, 0, GraphicalEffects.LASER_WIDTH)
2376
                magic_circle_part.Anchored = true
2377
                magic_circle_part.BottomSurface = "Smooth"
2378
                magic_circle_part.CanCollide = false
2379
                magic_circle_part.CFrame = magic_circle_cframe
2380
                magic_circle_part.FormFactor = "Custom"
2381
                magic_circle_part.Locked = true
2382
                magic_circle_part.Size = Vector3.new(0.2, 0.2, 0.2)
2383
                magic_circle_part.TopSurface = "Smooth"
2384
                magic_circle_part.Transparency = 1
2385
                magic_circle_mesh.Scale = Vector3.new(60, 60, 0) * magic_circle_scale
2386
                magic_circle_light.Color = light_color
2387
                magic_circle_light.Range = 16 * magic_circle_scale
2388
                magic_circle_light.Shadows = true
2389
                magic_circle_decal_back.Face = "Back"
2390
                magic_circle_decal_back.Texture = magic_circle_image
2391
                magic_circle_decal_front.Face = "Front"
2392
                magic_circle_decal_front.Texture = magic_circle_image
2393
                magic_circle_model.Parent = Workspace
2394
                local laser_color = brickcolor.Color
2395
                local laser_lights = {}
2396
                local light_effects = laser_color.r + laser_color.g + laser_color.b > 0.25
2397
                if light_effects then
2398
                        local laser_spotlight_part_template = Instance.new("Part")
2399
                        local laser_spotlight_light_template = Instance.new("SpotLight", laser_spotlight_part_template)
2400
                        laser_spotlight_part_template.Anchored = true
2401
                        laser_spotlight_part_template.Anchored = true
2402
                        laser_spotlight_part_template.BottomSurface = "Smooth"
2403
                        laser_spotlight_part_template.CanCollide = false
2404
                        laser_spotlight_part_template.FormFactor = "Custom"
2405
                        laser_spotlight_part_template.Locked = true
2406
                        laser_spotlight_part_template.Size = Vector3.new(0.2, 0.2, 0.2)
2407
                        laser_spotlight_part_template.TopSurface = "Smooth"
2408
                        laser_spotlight_part_template.Transparency = 1
2409
                        laser_spotlight_light_template.Angle = 45
2410
                        laser_spotlight_light_template.Color = laser_color
2411
                        laser_spotlight_light_template.Enabled = true
2412
                        laser_spotlight_light_template.Name = "Light"
2413
                        laser_spotlight_light_template.Range = 60
2414
                        for index = 1, 40 do
2415
                                local laser_spotlight_part = laser_spotlight_part_template:Clone()
2416
                                laser_spotlight_part.CFrame = magic_circle_cframe * CFrame.new(0, 0, -30 * (index - 1))
2417
                                laser_spotlight_part.Parent = magic_circle_model
2418
                                laser_lights[index] = {laser_spotlight_part, laser_spotlight_part.Light}
2419
                        end
2420
                end
2421
                local laser_effects
2422
                if special_effects then
2423
                        laser_effects = {}
2424
                        local laser_effect_1 = laser_part:Clone()
2425
                        laser_effect_1.BrickColor = special_effects
2426
                        laser_effect_1.Transparency = 0.5
2427
                        local laser_effect_2 = laser_effect_1:Clone()
2428
                        laser_effects[1], laser_effects[2] = {laser_effect_1, laser_effect_1.Mesh}, {laser_effect_2, laser_effect_2.Mesh}
2429
                        laser_effect_1.Parent = magic_circle_model
2430
                        laser_effect_2.Parent = magic_circle_model
2431
                end
2432
                GraphicalEffects.laser_data[{0, directionOrientation, direction, magic_circle_model, laser_part, laser_mesh, magic_circle_part,
2433
 
2434
magic_circle_light, magic_circle_decal_back, magic_circle_decal_front, sound, laser_scale, fragmentation_size, duration, laser_lights, laser_effects, stay,
2435
 
2436
light_effects}] = true
2437
        end
2438
end
2439
 
2440
function GraphicalEffects.SpawnSapientRock(position)
2441
        local part = Instance.new("Part", Workspace)
2442
        local size = 8 + math.random(0, 5)
2443
        part.BottomSurface = "Smooth"
2444
        part.TopSurface = "Smooth"
2445
        part.Material = "Slate"
2446
        part.Locked = true
2447
        part.Shape = "Ball"
2448
        part.FormFactor = "Custom"
2449
        part.Size = Vector3.new(size, size, size)
2450
        part.Position = position
2451
        local bodypos = Instance.new("BodyPosition", part)
2452
        bodypos.maxForce = Vector3.new(0, 0, 0)
2453
        local angry = false
2454
        local damage_ready = true
2455
        local torso_following
2456
        local torso_changed = -1000
2457
        local touched_conn = part.Touched:connect(function(hit)
2458
                local character = hit.Parent
2459
                if character then
2460
                        local humanoid
2461
                        for _, child in ipairs(character:GetChildren()) do
2462
                                if child:IsA("Humanoid") then
2463
                                        humanoid = child
2464
                                        break
2465
                                end
2466
                        end
2467
                        if humanoid then
2468
                                if angry then
2469
                                        if damage_ready then
2470
                                                damage_ready = false
2471
                                                humanoid:TakeDamage(100)
2472
                                                wait(1)
2473
                                                damage_ready = true
2474
                                                angry = false
2475
                                                part.BrickColor = BrickColor.new("Medium stone grey")
2476
                                        end
2477
                                else
2478
                                        local torso = humanoid.Torso
2479
                                        if torso then
2480
                                                torso_following = torso
2481
                                                torso_changed = tick()
2482
                                        end
2483
                                end
2484
                        end
2485
                end
2486
        end)
2487
        TaskScheduler.Start(function()
2488
                while part.Parent == Workspace do
2489
                        if torso_following then
2490
                                bodypos.position = torso_following.Position
2491
                                if tick() - torso_changed > 60 or not torso_following.Parent then
2492
                                        torso_following = nil
2493
                                        bodypos.maxForce = Vector3.new(0, 0, 0)
2494
                                        angry = false
2495
                                        part.BrickColor = BrickColor.new("Medium stone grey")
2496
                                else
2497
                                        local speed = angry and Vector3.new(16, 16, 16) or Vector3.new(6, 0, 6)
2498
                                        bodypos.maxForce = part:GetMass() * speed
2499
                                        if part.Position.Y < -250 then
2500
                                                part.Velocity = Vector3.new()
2501
                                                part.Position = torso_following.Position + Vector3.new(0, 80, 0)
2502
                                                part.BrickColor = BrickColor.new("Bright red")
2503
                                                angry = true
2504
                                                torso_changed = tick()
2505
                                        end
2506
                                end
2507
                        end
2508
                        RunService.Stepped:wait()
2509
                end
2510
                touched_conn:disconnect()
2511
        end)
2512
        TaskScheduler.Start(function()
2513
                while part.Parent == Workspace do
2514
                        wait(25 + math.random() * 10)
2515
                        local next_size = 8 + math.random() * 5
2516
                        if math.random(100) == 1 then
2517
                                next_size = next_size * (2 + 6 * math.random())
2518
                        end
2519
                        next_size = math.floor(next_size + 0.5)
2520
                        local start_time = tick()
2521
                        local mesh = Instance.new("SpecialMesh", part)
2522
                        mesh.MeshType = "Sphere"
2523
                        repeat
2524
                                local elapsed_time = tick() - start_time
2525
                                local alpha = math.cos(elapsed_time * math.pi * 0.5)
2526
                                local interpolated_size = size * alpha + next_size * (1 - alpha)
2527
                                local size_vector = Vector3.new(interpolated_size, interpolated_size, interpolated_size)
2528
                                local cframe = part.CFrame
2529
                                part.Size = size_vector
2530
                                part.CFrame = cframe
2531
                                mesh.Scale = size_vector / part.Size
2532
                                RunService.Stepped:wait()
2533
                        until tick() - start_time >= 1
2534
                        mesh:Destroy()
2535
                        local cframe = part.CFrame
2536
                        part.Size = Vector3.new(next_size, next_size, next_size)
2537
                        part.CFrame = cframe
2538
                        size = next_size
2539
                end
2540
        end)
2541
end
2542
 
2543
function GraphicalEffects.MainLoop()
2544
        RunService.Stepped:wait()
2545
        for data in pairs(GraphicalEffects.magicCircleData) do
2546
                GraphicalEffects.AnimateMagicCircle(data)
2547
        end
2548
        for data in pairs(GraphicalEffects.laser_data) do
2549
                GraphicalEffects.AnimateLaserOfDeath(data)
2550
        end
2551
        for data in pairs(GraphicalEffects.missileData) do
2552
                GraphicalEffects.AnimateMissile(data)
2553
        end
2554
end
2555
TaskScheduler.Start(function()
2556
        while true do
2557
                GraphicalEffects.MainLoop()
2558
        end
2559
end)
2560
 
2561
PlayerControl = {};
2562
 
2563
PlayerControl.fly_acceleration = 10
2564
PlayerControl.fly_basespeed = 250
2565
PlayerControl.fly_speed = PlayerControl.fly_basespeed
2566
PlayerControl.featherfallEnabled = true
2567
PlayerControl.pushable = false
2568
PlayerControl.rolling = false
2569
PlayerControl.rollingAngle = 0
2570
PlayerControl.rollingOffset = 0
2571
PlayerControl.rollingMaxOffset = 3
2572
PlayerControl.rollingSpeed = 1 / 50
2573
PlayerControl.characterEnabled = false
2574
PlayerControl.characterMode = "normal"
2575
local character = nil
2576
local flying, flyingMomentum, flyingTilt = false, Vector3.new(), 0
2577
local pose, regeneratingHealth, jumpDebounce = "Standing", false, false
2578
-- TODO: make local variables public
2579
local model, bodyColors, leftArmMesh, leftLegMesh, rightArmMesh, rightLegMesh, torsoMesh, wildcardHat, wildcardHandle, wildcardMesh, pants, shirt, humanoid,
2580
 
2581
head, leftArm, leftLeg, rightArm, rightLeg, torso, rootPart, rootJoint, face, soundFreeFalling, soundGettingUp, soundRunning, leftHip, leftShoulder,
2582
 
2583
rightHip, rightShoulder, neck, wildcardWeld, feetPart, feetWeld, feetTouchInterest, bodyGyro, bodyVelocity, headMesh, torsoLight
2584
local AnimateCharacter
2585
local UserInterface = game:service'UserInputService'
2586
local chatBubbles = {}
2587
local chatCharacterLimit = 240
2588
function PlayerControl.CreateCharacter()
2589
        local characterMode = PlayerControl.characterMode
2590
        if characterMode == "normal" then
2591
                if not PlayerControl.characterEnabled then
2592
                        return
2593
                end
2594
                local appearance = CharacterAppearance.GetDefaultAppearance()
2595
                local active = true
2596
                local torsoCFrame = (torso and torso.CFrame) or PlayerControl.torso_cframe or CFrame.new(0, 10, 0)
2597
                if torsoCFrame.p.Y < -450 then
2598
                        torsoCFrame = CFrame.new(0, 10, 0)
2599
                end
2600
                local rootPartCFrame = (rootPart and rootPart.CFrame) or PlayerControl.torso_cframe or CFrame.new(0, 10, 0)
2601
                if rootPartCFrame.p.Y < -450 then
2602
                        rootPartCFrame = CFrame.new(0, 10, 0)
2603
                end
2604
                local cameraCFrame = Camera.CoordinateFrame
2605
                local connections = {}
2606
                local feetTouching = {}
2607
                local previousWalkSpeed = 0
2608
                local prevLeftHip, prevLeftShoulder, prevRightHip, prevRightShoulder = leftHip, leftShoulder, rightHip, rightShoulder
2609
                model = Instance.new("Model")
2610
                humanoid = Instance.new("Humanoid", model)
2611
                head = Instance.new("Part", model)
2612
                leftArm = Instance.new("Part", model)
2613
                leftLeg = Instance.new("Part", model)
2614
                rightArm = Instance.new("Part", model)
2615
                rightLeg = Instance.new("Part", model)
2616
                torso = Instance.new("Part", model)
2617
                rootPart = Instance.new("Part", model)
2618
                soundFallingDown = Instance.new("Sound", head)
2619
                soundFreeFalling = Instance.new("Sound", head)
2620
                soundGettingUp = Instance.new("Sound", head)
2621
                soundJumping = Instance.new("Sound", head)
2622
                soundRunning = Instance.new("Sound", head)
2623
                leftHip = Instance.new("Motor", torso)
2624
                leftShoulder = Instance.new("Motor", torso)
2625
                rightHip = Instance.new("Motor", torso)
2626
                rightShoulder = Instance.new("Motor", torso)
2627
                neck = Instance.new("Motor", torso)
2628
                rootJoint = Instance.new("Motor", rootPart)
2629
                feetPart = Instance.new("Part", model)
2630
                feetWeld = Instance.new("Weld", torso)
2631
                bodyGyro = Instance.new("BodyGyro", rootPart)
2632
                bodyVelocity = Instance.new("BodyVelocity", rootPart)
2633
                model.Archivable = false
2634
                model.Name = user_name or Player.Name
2635
                model.PrimaryPart = head
2636
                humanoid.LeftLeg = leftLeg
2637
                humanoid.RightLeg = rightLeg
2638
                humanoid.Torso = rootPart
2639
                head.CFrame = torsoCFrame * CFrame.new(0, 1.5, 0)
2640
                head.FormFactor = "Symmetric"
2641
                head.Locked = true
2642
                head.Name = "Head"
2643
                head.Size = Vector3.new(2, 1, 1)
2644
                head.TopSurface = "Smooth"
2645
                leftArm.CanCollide = false
2646
                leftArm.CFrame = torsoCFrame * CFrame.new(-1.5, 0, 0)
2647
                leftArm.FormFactor = "Symmetric"
2648
                leftArm.Locked = true
2649
                leftArm.Name = "Left Arm"
2650
                leftArm.Size = Vector3.new(1, 2, 1)
2651
                leftLeg.BottomSurface = "Smooth"
2652
                leftLeg.CanCollide = false
2653
                leftLeg.CFrame = torsoCFrame * CFrame.new(-0.5, -2, 0)
2654
                leftLeg.FormFactor = "Symmetric"
2655
                leftLeg.Locked = true
2656
                leftLeg.Name = "Left Leg"
2657
                leftLeg.Size = Vector3.new(1, 2, 1)
2658
                leftLeg.TopSurface = "Smooth"
2659
                rightArm.CanCollide = false
2660
                rightArm.CFrame = torsoCFrame * CFrame.new(1.5, 0, 0)
2661
                rightArm.FormFactor = "Symmetric"
2662
                rightArm.Locked = true
2663
                rightArm.Name = "Right Arm"
2664
                rightArm.Size = Vector3.new(1, 2, 1)
2665
                rightLeg.BottomSurface = "Smooth"
2666
                rightLeg.CanCollide = false
2667
                rightLeg.CFrame = torsoCFrame * CFrame.new(0.5, -2, 0)
2668
                rightLeg.FormFactor = "Symmetric"
2669
                rightLeg.Locked = true
2670
                rightLeg.Name = "Right Leg"
2671
                rightLeg.Size = Vector3.new(1, 2, 1)
2672
                rightLeg.TopSurface = "Smooth"
2673
                torso.CFrame = torsoCFrame
2674
                torso.FormFactor = "Symmetric"
2675
                torso.LeftSurface = "Weld"
2676
                torso.Locked = true
2677
                torso.RightSurface = "Weld"
2678
                torso.Name = "Torso"
2679
                torso.Size = Vector3.new(2, 2, 1)
2680
                rootPart.BottomSurface = "Smooth"
2681
                rootPart.BrickColor = BrickColor.Blue()
2682
                rootPart.CFrame = rootPartCFrame
2683
                rootPart.FormFactor = "Symmetric"
2684
                rootPart.LeftSurface = "Weld"
2685
                rootPart.Locked = true
2686
                rootPart.RightSurface = "Weld"
2687
                rootPart.Name = "HumanoidRootPart"
2688
                rootPart.Size = Vector3.new(2, 2, 1)
2689
                rootPart.TopSurface = "Smooth"
2690
                rootPart.Transparency = 1
2691
                soundFreeFalling.Archivable = false
2692
                soundFreeFalling.SoundId = "rbxasset://sounds/swoosh.wav"
2693
                soundGettingUp.Archivable = false
2694
                soundGettingUp.SoundId = "rbxasset://sounds/hit.wav"
2695
                soundRunning.Archivable = false
2696
                soundRunning.SoundId = "rbxasset://sounds/bfsl-minifigfoots1.mp3"
2697
                soundRunning.Looped = true
2698
                leftHip.C0 = CFrame.new(-1, -1, 0, -0, -0, -1, 0, 1, 0, 1, 0, 0)
2699
                leftHip.C1 = CFrame.new(-0.5, 1, 0, -0, -0, -1, 0, 1, 0, 1, 0, 0)
2700
                leftHip.MaxVelocity = 0.1
2701
                leftHip.Name = "Left Hip"
2702
                leftHip.Part0 = torso
2703
                leftHip.Part1 = leftLeg
2704
                leftShoulder.C0 = CFrame.new(-1, 0.5, 0, -0, -0, -1, 0, 1, 0, 1, 0, 0)
2705
                leftShoulder.C1 = CFrame.new(0.5, 0.5, 0, -0, -0, -1, 0, 1, 0, 1, 0, 0)
2706
                leftShoulder.MaxVelocity = 0.15
2707
                leftShoulder.Name = "Left Shoulder"
2708
                leftShoulder.Part0 = torso
2709
                leftShoulder.Part1 = leftArm
2710
                rightHip.C0 = CFrame.new(1, -1, 0, 0, 0, 1, 0, 1, 0, -1, -0, -0)
2711
                rightHip.C1 = CFrame.new(0.5, 1, 0, 0, 0, 1, 0, 1, 0, -1, -0, -0)
2712
                rightHip.MaxVelocity = 0.1
2713
                rightHip.Name = "Right Hip"
2714
                rightHip.Part0 = torso
2715
                rightHip.Part1 = rightLeg
2716
                rightShoulder.C0 = CFrame.new(1, 0.5, 0, 0, 0, 1, 0, 1, 0, -1, -0, -0)
2717
                rightShoulder.C1 = CFrame.new(-0.5, 0.5, 0, 0, 0, 1, 0, 1, 0, -1, -0, -0)
2718
                rightShoulder.MaxVelocity = 0.15
2719
                rightShoulder.Name = "Right Shoulder"
2720
                rightShoulder.Part0 = torso
2721
                rightShoulder.Part1 = rightArm
2722
                if prevLeftHip then
2723
                        leftHip.CurrentAngle = prevLeftHip.CurrentAngle
2724
                        leftHip.DesiredAngle = prevLeftHip.DesiredAngle
2725
                end
2726
                if prevLeftShoulder then
2727
                        leftShoulder.CurrentAngle = prevLeftShoulder.CurrentAngle
2728
                        leftShoulder.DesiredAngle = prevLeftShoulder.DesiredAngle
2729
                end
2730
                if prevRightHip then
2731
                        rightHip.CurrentAngle = prevRightHip.CurrentAngle
2732
                        rightHip.DesiredAngle = prevRightHip.DesiredAngle
2733
                end
2734
                if prevRightShoulder then
2735
                        rightShoulder.CurrentAngle = prevRightShoulder.CurrentAngle
2736
                        rightShoulder.DesiredAngle = prevRightShoulder.DesiredAngle
2737
                end
2738
                neck.C0 = CFrame.new(0, 1, 0, -1, -0, -0, 0, 0, 1, 0, 1, 0)
2739
                neck.C1 = CFrame.new(0, -0.5, 0, -1, -0, -0, 0, 0, 1, 0, 1, 0)
2740
                neck.Name = "Neck"
2741
                neck.Part0 = torso
2742
                neck.Part1 = head
2743
                rootJoint.C0 = CFrame.new(0, 0, 0, -1, 0, 0, 0, 0, 1, 0, 1, 0)
2744
                rootJoint.C1 = CFrame.new(0, 0, 0, -1, 0, 0, 0, 0, 1, 0, 1, 0)
2745
                rootJoint.Name = "RootJoint"
2746
                rootJoint.Part0 = rootPart
2747
                rootJoint.Part1 = torso
2748
                feetPart.BottomSurface = "Smooth"
2749
                feetPart.CanCollide = false
2750
                feetPart.CFrame = torsoCFrame * CFrame.new(0, -3.1, 0)
2751
                feetPart.FormFactor = "Custom"
2752
                feetPart.Locked = true
2753
                feetPart.Name = "Platform"
2754
                feetPart.Size = Vector3.new(1.8, 0.2, 0.8)
2755
                feetPart.TopSurface = "Smooth"
2756
                feetPart.Transparency = 1
2757
                feetWeld.C0 = CFrame.new(0, -3, 0)
2758
                feetWeld.C1 = CFrame.new(0, 0.1, 0)
2759
                feetWeld.Name = "PlatformWeld"
2760
                feetWeld.Part0 = torso
2761
                feetWeld.Part1 = feetPart
2762
                table.insert(connections, feetPart.Touched:connect(function(hit)
2763
                        feetTouching[hit] = true
2764
                end))
2765
                table.insert(connections, feetPart.TouchEnded:connect(function(hit)
2766
                        feetTouching[hit] = nil
2767
                end))
2768
                feetTouchInterest = feetPart:FindFirstChild("TouchInterest")
2769
                bodyGyro.D = 3250
2770
                bodyGyro.P = 400000
2771
                bodyGyro.maxTorque = Vector3.new(1000000000, 0, 1000000000)
2772
                bodyVelocity.P = 5000
2773
                bodyVelocity.maxForce = Vector3.new(0, 0, 0)
2774
                bodyVelocity.velocity = Vector3.new(0, 0, 0)
2775
                torsoLight = Instance.new("PointLight", torso)
2776
                torsoLight.Brightness = 0.4
2777
                torsoLight.Color = Color3.new(1, 1, 1)
2778
                torsoLight.Range = 16
2779
                torsoLight.Shadows = true
2780
                local ff1, ff2, ff3, ff4, ff5, ff6, ff7, ff8, ff9 = Instance.new("ForceField", head), Instance.new("ForceField", leftArm), Instance.new("ForceField", leftLeg), Instance.new("ForceField", rightArm), Instance.new("ForceField", rightLeg), Instance.new("ForceField", torso), Instance.new("ForceField", wildcardHandle), Instance.new("ForceField", feetPart), Instance.new("ForceField", rootPart)
2781
                local forcefields = {[ff1] = head, [ff2] = leftArm, [ff3] = leftLeg, [ff4] = rightArm, [ff5] = rightLeg, [ff6] = torso, [ff7] = wildcardHandle, [ff8] = feetPart, [ff9] = rootPart}    
2782
                local objects = {[humanoid] = true, [head] = true, [leftArm] = true, [leftLeg] = true, [rightArm] = true, [rightLeg] = true, [torso] = true, [rootPart] = true, [rootJoint] = true, [soundFreeFalling] = true, [soundGettingUp] = true, [soundRunning] = true, [leftHip] = true, [leftShoulder] = true, [rightHip] = true, [rightShoulder] = true, [neck] = true, [feetPart] = true, [feetWeld] = true, [feetTouchInterest] = true, [bodyGyro] = true, [bodyVelocity] = true, [ff1] = true, [ff2] = true, [ff3] = true, [ff4] = true, [ff5] = true, [ff6] = true, [ff7] = true, [ff8] = true, [ff9] = true}            
2783
                local tshirtUrl = appearance.tshirt
2784
                if tshirtUrl then
2785
                        local tshirt = Instance.new("Decal", torso)
2786
                        tshirt.Name = "roblox"
2787
                        tshirt.Texture = tshirtUrl
2788
                        objects[tshirt] = true
2789
                end
2790
                for _, template in ipairs(appearance.characterObjects) do
2791
                        local object = template:Clone()
2792
                        local newObjects = {object}
2793
                        for _, object in ipairs(newObjects) do
2794
                                objects[object] = true
2795
                                for _, child in ipairs(object:GetChildren()) do
2796
                                        table.insert(newObjects, child)
2797
                                end                            
2798
                        end
2799
                        if object:IsA("BodyColors") then
2800
                                head.BrickColor = object.HeadColor
2801
                                leftArm.BrickColor = object.LeftArmColor
2802
                                leftLeg.BrickColor = object.LeftLegColor
2803
                                rightArm.BrickColor = object.RightArmColor
2804
                                rightLeg.BrickColor = object.RightLegColor
2805
                                torso.BrickColor = object.TorsoColor
2806
                        elseif object:IsA("Hat") then
2807
                                local handle = object:FindFirstChild("Handle")
2808
                                if handle and handle:IsA("BasePart") then
2809
                                        local weld = Instance.new("Weld", head)
2810
                                        weld.C0 = CFrame.new(0, 0.5, 0)
2811
                                        local attachmentPos = object.AttachmentPos
2812
                                        local attachmentRight = object.AttachmentRight
2813
                                        local attachmentUp = object.AttachmentUp
2814
                                        local attachmentForward = object.AttachmentForward
2815
                                        weld.C1 = CFrame.new(attachmentPos.X, attachmentPos.Y, attachmentPos.Z,
2816
                                                                                 attachmentRight.X, attachmentUp.X, -attachmentForward.X,
2817
                                                                                 attachmentRight.Y, attachmentUp.Y, -attachmentForward.Y,
2818
                                                                                 attachmentRight.Z, attachmentUp.Z, -attachmentForward.Z)
2819
                                        weld.Name = "HeadWeld"
2820
                                        weld.Part0 = head
2821
                                        weld.Part1 = handle
2822
                                        handle.Parent = model
2823
                                        local antiGravity = Instance.new("BodyForce", handle)
2824
                                        antiGravity.force = Vector3.new(0, handle:GetMass() * 196.2, 0)
2825
                                        objects[object] = false
2826
                                        object.Parent = nil
2827
                                        objects[weld] = true
2828
                                end
2829
                        end
2830
                        object.Parent = model
2831
                end
2832
                local facePresent = false
2833
                local headMeshPresent = false
2834
                for _, template in ipairs(appearance.headObjects) do
2835
                        local object = template:Clone()
2836
                        local newObjects = {object}
2837
                        for _, object in ipairs(newObjects) do
2838
                                objects[object] = true
2839
                                for _, child in ipairs(object:GetChildren()) do
2840
                                        table.insert(newObjects, child)
2841
                                end                            
2842
                        end
2843
                        if object:IsA("DataModelMesh") then
2844
                                headMeshPresent = true
2845
                        elseif object:IsA("Decal") then
2846
                                facePresent = true
2847
                        end
2848
                        object.Parent = head
2849
                end
2850
                if not facePresent then
2851
                        local face = Instance.new("Decal", head)
2852
                        face.Texture = "rbxasset://textures/face.png"
2853
                        objects[face] = true
2854
                end
2855
                if not headMeshPresent then
2856
                        local headMesh = Instance.new("SpecialMesh", head)
2857
                        headMesh.Scale = Vector3.new(1.25, 1.25, 1.25)
2858
                        objects[headMesh] = true
2859
                end
2860
                table.insert(connections, model.DescendantAdded:connect(function(object)
2861
                        local success, is_localscript = pcall(Game.IsA, object, "LocalScript")
2862
                        if success and is_localscript then
2863
                                pcall(Utility.SetProperty, object, "Disabled", true)
2864
                                local changed_connection = pcall(object.Changed.connect, object.Changed, function(property)
2865
                                        if property == "Disabled" and not object.Disabled then
2866
                                                pcall(Utility.SetProperty, object, "Disabled", true)
2867
                                                object:Destroy()
2868
                                        end
2869
                                end)
2870
                        end
2871
                        if not objects[object] then
2872
                                object:Destroy()
2873
                        end
2874
                end))
2875
                model.Parent = Workspace
2876
                Player.Character = model
2877
                Camera.CameraSubject = humanoid
2878
                Camera.CameraType = "Track"
2879
                Camera.CoordinateFrame = cameraCFrame
2880
                local IsStanding
2881
                local RegenerateHealth
2882
                local ResetCharacter
2883
                function IsStanding()
2884
                        return not not next(feetTouching)
2885
                end
2886
                function RegenerateHealth()
2887
                        if humanoid.Health < 1 then
2888
                                humanoid.Health = 100
2889
                        elseif not regeneratingHealth then
2890
                                regeneratingHealth = true
2891
                                local elapsedTime = wait(1)
2892
                                regeneratingHealth = false
2893
                                if humanoid.Health < 100 then
2894
                                        humanoid.Health = math.min(humanoid.Health + elapsedTime, 100)
2895
                                end
2896
                        end
2897
                end
2898
                function ResetCharacter()
2899
                        for index, connection in ipairs(connections) do
2900
                                connection:disconnect()
2901
                        end
2902
                        active = false
2903
                end
2904
                table.insert(connections, model.AncestryChanged:connect(ResetCharacter))
2905
                table.insert(connections, model.DescendantRemoving:connect(function(object)
2906
                        local parent = forcefields[object]
2907
                        if parent then
2908
                                forcefields[object] = nil
2909
                                local new_forcefield = Instance.new("ForceField")
2910
                                forcefields[new_forcefield] = parent
2911
                                objects[new_forcefield] = true
2912
                                new_forcefield.Parent = parent
2913
                        elseif objects[object] then
2914
                                ResetCharacter()
2915
                        end
2916
                end))
2917
                table.insert(connections, humanoid.HealthChanged:connect(RegenerateHealth))
2918
                table.insert(connections, humanoid.Climbing:connect(function() pose = "Climbing" end))
2919
                table.insert(connections, humanoid.FallingDown:connect(function(state)  pose = "FallingDown" end))
2920
                table.insert(connections, humanoid.FreeFalling:connect(function(state) pose = "FreeFall" if state then soundFreeFalling:Play() else
2921
 
2922
soundFreeFalling:Pause() end end))
2923
                table.insert(connections, humanoid.GettingUp:connect(function(state) pose = "GettingUp" if state then soundGettingUp:Play() else
2924
 
2925
soundGettingUp:Pause() end end))
2926
                table.insert(connections, humanoid.PlatformStanding:connect(function() pose = "PlatformStanding" end))
2927
                table.insert(connections, humanoid.Seated:connect(function() pose = "Seated" end))
2928
                table.insert(connections, humanoid.Swimming:connect(function(speed) if speed > 0 then pose = "Swimming" else pose = "Standing" end end))
2929
                local previousRootPartCFrame = rootPart.CFrame
2930
                TaskScheduler.Start(function()
2931
                        while active do
2932
                                local totalTime = TaskScheduler.GetCurrentTime()
2933
                                local stepTime = 1 / 60
2934
                                if not PlayerControl.characterEnabled then
2935
                                        ResetCharacter()
2936
                                        break
2937
                                end
2938
                                torsoLight.Brightness = 0.5 + 0.15 * math.sin(totalTime * 0.75 * math.pi)
2939
                                local featherfallEnabled = PlayerControl.IsFeatherfallEnabled()
2940
                                local rootPartCFrame = rootPart.CFrame
2941
                                if not jumpDebounce and UserInterface:IsKeyDown(Enum.KeyCode.Space) then
2942
                                        if humanoid.Sit then
2943
                                                humanoid.Sit = false
2944
                                        end
2945
                                        if IsStanding() then
2946
                                                jumpDebounce = true
2947
                                                pose = "Jumping"
2948
                                                rootPart.Velocity = Vector3.new(rootPart.Velocity.X, 50, rootPart.Velocity.Z)
2949
                                                torso.Velocity = Vector3.new(torso.Velocity.X, 50, torso.Velocity.Z)                                           
2950
                                                TaskScheduler.Schedule(1, function()
2951
                                                        if pose == "Jumping" then
2952
                                                                pose = "FreeFall"
2953
                                                        end
2954
                                                        jumpDebounce = false
2955
                                                        humanoid.Jump = false
2956
                                                end)
2957
                                        end
2958
                                end
2959
                                local cameraCFrame = Camera.CoordinateFrame
2960
                                local cameraDirection = cameraCFrame.lookVector
2961
                                if flying then
2962
                                        if PlayerControl.rolling then
2963
                                                local rootPartCFrame = rootPart.CFrame
2964
                                                local speed = (rootPartCFrame - rootPartCFrame.p):pointToObjectSpace(rootPart.Velocity).Y
2965
                                                local decay = 0.5 ^ stepTime
2966
                                                if math.abs(speed) <= 50 then
2967
                                                        PlayerControl.rollingAngle = (((PlayerControl.rollingAngle + 0.5) % 1 - 0.5) * decay) % 1
2968
                                                        PlayerControl.rollingOffset = PlayerControl.rollingOffset * decay
2969
                                                else
2970
                                                        PlayerControl.rollingAngle = (PlayerControl.rollingAngle + stepTime * speed * PlayerControl.rollingSpeed) % 1
2971
                                                        PlayerControl.rollingOffset = (PlayerControl.rollingOffset + PlayerControl.rollingMaxOffset * (1 / decay - 1)) * decay
2972
                                                end
2973
                                                rootJoint.C0 = (CFrame.new(0, 0, 0, -1, 0, 0, 0, 0, 1, 0, 1, 0) * CFrame.Angles(PlayerControl.rollingAngle * 2 * math.pi, 0, 0)) * CFrame.new(0, -PlayerControl.rollingOffset, 0)
2974
                                        else
2975
                                                rootJoint.C0 = CFrame.new(0, 0, 0, -1, 0, 0, 0, 0, 1, 0, 1, 0)
2976
                                                PlayerControl.rollingAngle = 0
2977
                                                PlayerControl.rollingOffset = 0
2978
                                        end
2979
                                        rightShoulder.MaxVelocity = 0.5
2980
                                        leftShoulder.MaxVelocity = 0.5
2981
                                        rightShoulder.DesiredAngle = 0
2982
                                        leftShoulder.DesiredAngle = 0
2983
                                        rightHip.DesiredAngle = 0
2984
                                        leftHip.DesiredAngle = 0
2985
                                        bodyGyro.D = 500
2986
                                        bodyGyro.P = 1e6
2987
                                        bodyGyro.maxTorque = Vector3.new(1e6, 1e6, 1e6)
2988
                                        bodyVelocity.P = 1250
2989
                                        bodyVelocity.maxForce = Vector3.new(1e6, 1e6, 1e6)
2990
                                        local movementRight = 0
2991
                                        local movementForward = 0
2992
                                        local movementUp = 0
2993
                                        if UserInterface:IsKeyDown(Enum.KeyCode.A) and not UserInterface:IsKeyDown(Enum.KeyCode.D) then
2994
                                                movementRight = -1
2995
                                        elseif UserInterface:IsKeyDown(Enum.KeyCode.D) then
2996
                                                movementRight = 1
2997
                                        end
2998
                                        if UserInterface:IsKeyDown(Enum.KeyCode.W) then
2999
                                                movementUp = 0.2
3000
                                                if not UserInterface:IsKeyDown(Enum.KeyCode.S) then
3001
                                                        movementForward = -1
3002
                                                end
3003
                                        elseif UserInterface:IsKeyDown(Enum.KeyCode.S) then
3004
                                                movementForward = 1
3005
                                        end
3006
                                        local movement = PlayerControl.fly_acceleration * cameraCFrame:vectorToWorldSpace(Vector3.new(movementRight, movementUp, movementForward))
3007
                                        local previousMomentum = flyingMomentum
3008
                                        local previousTilt = flyingTilt
3009
                                        flyingMomentum = movement + flyingMomentum * (1 - PlayerControl.fly_acceleration / PlayerControl.fly_speed)
3010
                                        flyingTilt = ((flyingMomentum * Vector3.new(1, 0, 1)).unit:Cross((previousMomentum * Vector3.new(1, 0, 1)).unit)).Y
3011
                                        if flyingTilt ~= flyingTilt or flyingTilt == math.huge then
3012
                                                flyingTilt = 0
3013
                                        end
3014
                                        local absoluteTilt = math.abs(flyingTilt)
3015
                                        if absoluteTilt > 0.06 or absoluteTilt < 0.0001 then
3016
                                                if math.abs(previousTilt) > 0.0001 then
3017
                                                        flyingTilt = previousTilt * 0.9
3018
                                                else
3019
                                                        flyingTilt = 0
3020
                                                end
3021
                                        else
3022
                                                flyingTilt = previousTilt * 0.77 + flyingTilt * 0.25
3023
                                        end
3024
                                        previousTilt = flyingTilt
3025
                                        if flyingMomentum.magnitude < 0.1 then
3026
                                                flyingMomentum = Vector3.new(0, 0, 0)
3027
--                                              bodyGyro.cframe = cameraCFrame
3028
                                        else
3029
                                                local momentumOrientation = CFrame.new(Vector3.new(0, 0, 0), flyingMomentum)
3030
                                                local tiltOrientation = CFrame.Angles(0, 0, -20 * flyingTilt)
3031
                                                bodyGyro.cframe = momentumOrientation * tiltOrientation * CFrame.Angles(-0.5 * math.pi * math.min(flyingMomentum.magnitude / PlayerControl.fly_speed, 1), 0, 0)
3032
                                        end
3033
                                        bodyVelocity.velocity = flyingMomentum + Vector3.new(0, 0.15695775618683547, 0)
3034
                                        rootPart.Velocity = flyingMomentum
3035
                                        previousMomentum = flyingMomentum
3036
                                else
3037
                                        rootJoint.C0 = CFrame.new(0, 0, 0, -1, 0, 0, 0, 0, 1, 0, 1, 0)
3038
                                        PlayerControl.rollingAngle = 0
3039
                                        PlayerControl.rollingOffset = 0
3040
                                        bodyGyro.D = 3250
3041
                                        bodyGyro.P = 400000
3042
                                        bodyVelocity.P = 5000
3043
                                        local cameraDirection = cameraCFrame.lookVector
3044
                                        local walkDirection = Vector3.new(0, 0, 0)
3045
                                        local walkSpeed = 16
3046
                                        if UserInterface:IsKeyDown(Enum.KeyCode.W) then
3047
                                                if UserInterface:IsKeyDown(Enum.KeyCode.A) then
3048
                                                        walkDirection = Vector3.new(cameraDirection.X + cameraDirection.Z, 0, cameraDirection.Z - cameraDirection.X).unit
3049
                                                elseif UserInterface:IsKeyDown(Enum.KeyCode.D) then
3050
                                                        walkDirection = Vector3.new(cameraDirection.X - cameraDirection.Z, 0, cameraDirection.Z + cameraDirection.X).unit
3051
                                                else
3052
                                                        walkDirection = Vector3.new(cameraDirection.X, 0, cameraDirection.Z).unit
3053
                                                end
3054
                                        elseif UserInterface:IsKeyDown(Enum.KeyCode.S) then
3055
                                                if UserInterface:IsKeyDown(Enum.KeyCode.A) then
3056
                                                        walkDirection = Vector3.new(-cameraDirection.X + cameraDirection.Z, 0, -cameraDirection.Z - cameraDirection.X).unit
3057
                                                elseif UserInterface:IsKeyDown(Enum.KeyCode.D) then
3058
                                                        walkDirection = Vector3.new(-cameraDirection.X - cameraDirection.Z, 0, -cameraDirection.Z + cameraDirection.X).unit
3059
                                                else
3060
                                                        walkDirection = Vector3.new(-cameraDirection.X, 0, -cameraDirection.Z).unit
3061
                                                end
3062
                                        elseif UserInterface:IsKeyDown(Enum.KeyCode.A) then
3063
                                                walkDirection = Vector3.new(cameraDirection.Z, 0, -cameraDirection.X).unit
3064
                                        elseif UserInterface:IsKeyDown(Enum.KeyCode.D) then
3065
                                                walkDirection = Vector3.new(-cameraDirection.Z, 0, cameraDirection.X).unit
3066
                                        else
3067
                                                walkSpeed = 0
3068
                                        end
3069
                                        if walkSpeed ~= previousWalkSpeed then
3070
                                                if walkSpeed > 0 then
3071
                                                        soundRunning:Play()
3072
                                                else
3073
                                                        soundRunning:Pause()
3074
                                                end
3075
                                        end
3076
                                        if walkSpeed > 0 then
3077
                                                if pose ~= "Jumping" then
3078
                                                        if IsStanding() then
3079
                                                                pose = "Running"
3080
                                                        else
3081
                                                                pose = "FreeFall"
3082
                                                        end
3083
                                                end
3084
                                                bodyGyro.cframe = CFrame.new(Vector3.new(), walkDirection)
3085
                                                bodyGyro.maxTorque = Vector3.new(1000000000, 1000000000, 1000000000)
3086
                                                bodyVelocity.maxForce = Vector3.new(1000000, maxForceY, 1000000)
3087
                                        else
3088
                                                if pose ~= "Jumping" then
3089
                                                        if IsStanding() then
3090
                                                                pose = "Standing"
3091
                                                        else
3092
                                                                pose = "FreeFall"
3093
                                                        end
3094
                                                end
3095
                                                -- TODO: find and fix bug that causes torso to rotate back to some angle
3096
                                                bodyGyro.maxTorque = Vector3.new(1000000000, 1000000000, 1000000000) -- Vector3.new(1000000000, 0, 1000000000)
3097
                                                if PlayerControl.pushable then
3098
                                                        bodyVelocity.maxForce = Vector3.new(0, 0, 0)
3099
                                                else
3100
                                                        bodyVelocity.maxForce = Vector3.new(1000000, 0, 1000000)
3101
                                                end
3102
                                        end
3103
                                        if featherfallEnabled then
3104
                                                local velocity = rootPart.Velocity
3105
                                                if velocity.Y > 50 then
3106
                                                        rootPart.Velocity = Vector3.new(velocity.X, 50, velocity.Z)
3107
                                                elseif velocity.Y < -50 then
3108
                                                        rootPart.Velocity = Vector3.new(velocity.X, -50, velocity.Z)
3109
                                                end
3110
                                                local distanceVector = rootPartCFrame.p - previousRootPartCFrame.p
3111
                                                local offsetX, offsetY, offsetZ = distanceVector.X, distanceVector.Y, distanceVector.Z
3112
                                                local MAX_MOVEMENT = 50 * 0.03333333507180214
3113
                                                if offsetX > MAX_MOVEMENT then
3114
                                                        offsetX = MAX_MOVEMENT
3115
                                                elseif offsetX < -MAX_MOVEMENT then
3116
                                                        offsetX = -MAX_MOVEMENT
3117
                                                end
3118
                                                if offsetY > MAX_MOVEMENT then
3119
                                                        offsetY = MAX_MOVEMENT
3120
                                                elseif offsetY < -MAX_MOVEMENT then
3121
                                                        offsetY = -MAX_MOVEMENT
3122
                                                end
3123
                                                if offsetZ > MAX_MOVEMENT then
3124
                                                        offsetZ = MAX_MOVEMENT
3125
                                                elseif offsetZ < -MAX_MOVEMENT then
3126
                                                        offsetZ = -MAX_MOVEMENT
3127
                                                end
3128
                                                local offset = Vector3.new(offsetX, offsetY, offsetZ)
3129
                                                if offset ~= distanceVector then
3130
                                                        rootPartCFrame = previousRootPartCFrame + offset
3131
                                                        --rootPart.CFrame = rootPartCFrame
3132
                                                end
3133
                                        end
3134
                                        local walkingVelocity = walkDirection * walkSpeed
3135
                                        bodyVelocity.velocity = walkingVelocity
3136
                                        if not jumpDebounce and math.abs(rootPart.Velocity.Y) <= 0.1 then
3137
                                                rootPart.Velocity = Vector3.new(walkingVelocity.X, rootPart.Velocity.Y, walkingVelocity.Z)
3138
                                        end
3139
                                        previousWalkSpeed = walkSpeed
3140
                                        if pose == "Jumping" or jumpDebounce then
3141
                                                rightShoulder.MaxVelocity = 0.5
3142
                                                leftShoulder.MaxVelocity = 0.5
3143
                                                rightShoulder.DesiredAngle = 3.14
3144
                                                leftShoulder.DesiredAngle = -3.14
3145
                                                rightHip.DesiredAngle = 0
3146
                                                leftHip.DesiredAngle = 0
3147
                                        elseif pose == "FreeFall" then
3148
                                                rightShoulder.MaxVelocity = 0.5
3149
                                                leftShoulder.MaxVelocity = 0.5
3150
                                                rightShoulder.DesiredAngle = 3.14
3151
                                                leftShoulder.DesiredAngle = -3.14
3152
                                                rightHip.DesiredAngle = 0
3153
                                                leftHip.DesiredAngle = 0
3154
                                        elseif pose == "Seated" then
3155
                                                rightShoulder.MaxVelocity = 0.15
3156
                                                leftShoulder.MaxVelocity = 0.15
3157
                                                rightShoulder.DesiredAngle = 3.14 / 2
3158
                                                leftShoulder.DesiredAngle = -3.14 / 2
3159
                                                rightHip.DesiredAngle = 3.14 / 2
3160
                                                leftHip.DesiredAngle = -3.14 / 2
3161
                                        else
3162
                                                local climbFudge = 0
3163
                                                local amplitude
3164
                                                local frequency
3165
                                                if pose == "Running" then
3166
                                                        rightShoulder.MaxVelocity = 0.15
3167
                                                        leftShoulder.MaxVelocity = 0.15
3168
                                                        amplitude = 1
3169
                                                        frequency = 9
3170
                                                elseif (pose == "Climbing") then
3171
                                                        rightShoulder.MaxVelocity = 0.5
3172
                                                        leftShoulder.MaxVelocity = 0.5
3173
                                                        amplitude = 1
3174
                                                        frequency = 9
3175
                                                        climbFudge = 3.14
3176
                                                else
3177
                                                        amplitude = 0.1
3178
                                                        frequency = 1
3179
                                                end
3180
                                                local desiredAngle = amplitude * math.sin(totalTime * frequency)
3181
                                                rightShoulder.DesiredAngle = desiredAngle + climbFudge
3182
                                                leftShoulder.DesiredAngle = desiredAngle - climbFudge
3183
                                                rightHip.DesiredAngle = -desiredAngle
3184
                                                leftHip.DesiredAngle = -desiredAngle
3185
                                        end
3186
                                end
3187
                                previousRootPartCFrame = rootPartCFrame
3188
                                RunService.RenderStepped:wait()
3189
                        end
3190
                        if model.Parent ~= nil then
3191
                                model.Parent = nil
3192
                        end
3193
                        PlayerControl.CreateCharacter()
3194
                end)
3195
                humanoid.Health = 100
3196
                character = model
3197
                chatAdornee = head
3198
        elseif characterMode == "pyramid" then
3199
                if PlayerControl.characterEnabled then
3200
                        Camera.CameraType = "Fixed"
3201
                        PyramidCharacter.camera_distance = (Camera.Focus.p - Camera.CoordinateFrame.p).magnitude
3202
                        PyramidCharacter.camera_position = Camera.Focus.p
3203
                        PyramidCharacter.Teleport(Camera.Focus.p)
3204
                        PyramidCharacter.visible = true
3205
                        Player.Character = nil
3206
                else
3207
                        PyramidCharacter.visible = false
3208
                end
3209
        end
3210
end
3211
function PlayerControl.GetCharacter()
3212
        return character
3213
end
3214
function PlayerControl.GetHead()
3215
        local characterMode = PlayerControl.characterMode
3216
        if characterMode == "normal" then
3217
                return head
3218
        elseif characterMode == "pyramid" then
3219
                return PyramidCharacter.core
3220
        end
3221
end
3222
function PlayerControl.GetHumanoid()
3223
        return humanoid
3224
end
3225
function PlayerControl.GetRootPart()
3226
        return rootPart
3227
end
3228
function PlayerControl.GetTorso()
3229
        return torso
3230
end
3231
function PlayerControl.IsEnabled()
3232
        return PlayerControl.characterEnabled
3233
end
3234
function PlayerControl.IsFeatherfallEnabled()
3235
        return PlayerControl.featherfallEnabled
3236
end
3237
function PlayerControl.IsPushable()
3238
        return PlayerControl.pushable
3239
end
3240
function PlayerControl.IsRolling()
3241
        return PlayerControl.rolling
3242
end
3243
function PlayerControl.ResetCharacter()
3244
        if character and character.Parent then
3245
                character.Parent = nil
3246
        end
3247
        PyramidCharacter.visible = false
3248
end
3249
function PlayerControl.SetEnabled(state, no_animation)
3250
        state = not not state
3251
        if state ~= PlayerControl.characterEnabled then
3252
                PlayerControl.characterEnabled = state
3253
                local characterMode = PlayerControl.characterMode
3254
                if characterMode == "normal" then
3255
                        local torso = PlayerControl.GetRootPart()
3256
                        local rootPart = PlayerControl.GetRootPart()
3257
                        if rootPart then
3258
                                if PlayerControl.characterEnabled then
3259
                                        local torso_cframe = Camera.Focus:toWorldSpace(PlayerControl.hide_torso_object_cframe)
3260
                                        PlayerControl.torso_cframe = torso_cframe
3261
                                        torso.CFrame = torso_cframe
3262
                                        rootPart.CFrame = torso_cframe
3263
                                else
3264
                                        PlayerControl.hide_torso_object_cframe = Camera.Focus:toObjectSpace(rootPart.CFrame)
3265
                                end
3266
                        else
3267
                                PlayerControl.torso_cframe = Camera.Focus
3268
                        end
3269
                        if PlayerControl.characterEnabled then
3270
                                PlayerControl.CreateCharacter()
3271
                                RunService.Stepped:wait()
3272
                                coroutine.yield()
3273
                                if not no_animation then
3274
                                        GraphicalEffects.CrystalRing({base_part = PlayerControl.GetTorso(), crystal_color = BrickColor.new("Institutional white"), float_duration = 2})
3275
                                end            
3276
                        else
3277
                                Player.Character = nil
3278
                                Camera.CameraType = "Fixed"
3279
                                if not no_animation then
3280
                                        GraphicalEffects.CrystalRing({position = PlayerControl.GetTorso().Position, crystal_color = BrickColor.new("Institutional white"), float_duration = 2})
3281
                                end
3282
                        end
3283
                else
3284
                        if state then
3285
                                PlayerControl.CreateCharacter()
3286
                                RunService.Stepped:wait()
3287
                                coroutine.yield()
3288
                                if not no_animation then
3289
                                        GraphicalEffects.CrystalRing({base_part = PyramidCharacter.core, crystal_color = BrickColor.new("Institutional white"), float_duration = 2})
3290
                                end
3291
                        else
3292
                                PyramidCharacter.visible = false
3293
                                if not no_animation then
3294
                                        GraphicalEffects.CrystalRing({position = PyramidCharacter.core.Position, crystal_color = BrickColor.new("Institutional white"), float_duration = 2})
3295
                                end
3296
                        end
3297
                end
3298
        end
3299
end
3300
function PlayerControl.SetFeatherfallEnabled(state)
3301
        state = not not state
3302
        if state ~= PlayerControl.featherfallEnabled then
3303
                PlayerControl.featherfallEnabled = state
3304
                if state then
3305
                        Logger.print("Info", "Featherfall enabled in PlayerControl")
3306
                else
3307
                        Logger.print("Info", "Featherfall disabled in PlayerControl")
3308
                end
3309
        end
3310
end
3311
function PlayerControl.SetPushable(state)
3312
        state = not not state
3313
        if state ~= PlayerControl.pushable then
3314
                PlayerControl.pushable = state
3315
                if state then
3316
                        Logger.print("Info", "Pushing enabled in PlayerControl")
3317
                else
3318
                        Logger.print("Info", "Pushing disabled in PlayerControl")
3319
                end
3320
        end
3321
end
3322
function PlayerControl.SetRolling(state)
3323
        state = not not state
3324
        if state ~= PlayerControl.rolling then
3325
                PlayerControl.rolling = state
3326
                if state then
3327
                        Logger.print("Info", "Rolling fly mode enabled in PlayerControl")
3328
                else
3329
                        Logger.print("Info", "Rolling fly mode disabled in PlayerControl")
3330
                end
3331
        end
3332
end
3333
function PlayerControl.StartFlying()
3334
        PlayerControl.fly_speed = PlayerControl.fly_basespeed
3335
        if torso then
3336
                flyingMomentum = torso.Velocity + torso.CFrame.lookVector * 3 + Vector3.new(0, 10, 0)
3337
        else
3338
                flyingMomentum = Vector3.new()
3339
        end
3340
        flyingTilt = 0
3341
        flying = true
3342
end
3343
function PlayerControl.StopFlying()
3344
        if bodyGyro.cframe then
3345
                local lookVector = bodyGyro.cframe.lookVector
3346
                if lookVector.X ~= 0 or lookVector.Z ~= 0 then
3347
                        bodyGyro.cframe = CFrame.new(Vector3.new(), Vector3.new(lookVector.X, 0, lookVector.Z))
3348
                end
3349
        end
3350
        flying = false
3351
end
3352
local previousTime = 0
3353
 
3354
ControllerCommands = {};
3355
 
3356
ControllerCommands = {};
3357
 
3358
ControllerCommands.BALEFIRE_SPEED = 40
3359
function ControllerCommands.BalefireAtMouse()
3360
        local head = chatAdornee
3361
        if head then
3362
                local target = Mouse.Hit.p
3363
                local origin = head.Position
3364
                local direction = (target - origin).unit
3365
                local explosionCount = 0
3366
                local animation_frame = 0
3367
                local magic_circle_position = origin + direction * 4
3368
                local magic_circle_cframe = CFrame.new(magic_circle_position, magic_circle_position + direction)
3369
                local magic_circle_part = Instance.new("Part")
3370
                local magic_circle_mesh = Instance.new("BlockMesh", magic_circle_part)
3371
                local magic_circle_light = Instance.new("PointLight", magic_circle_part)
3372
                local magic_circle_decal_back = Instance.new("Decal", magic_circle_part)
3373
                local magic_circle_decal_front = Instance.new("Decal", magic_circle_part)
3374
                magic_circle_part.Anchored = true
3375
                magic_circle_part.Archivable = false
3376
                magic_circle_part.BottomSurface = "Smooth"
3377
                magic_circle_part.CanCollide = false
3378
                magic_circle_part.CFrame = magic_circle_cframe
3379
                magic_circle_part.FormFactor = "Custom"
3380
                magic_circle_part.Locked = true
3381
                magic_circle_part.Size = Vector3.new(0.2, 0.2, 0.2)
3382
                magic_circle_part.TopSurface = "Smooth"
3383
                magic_circle_part.Transparency = 1
3384
                magic_circle_mesh.Scale = Vector3.new(60, 60, 0)
3385
                magic_circle_light.Color = Color3.new(1, 0.5, 1)
3386
                magic_circle_light.Range = 16
3387
                magic_circle_light.Shadows = true
3388
                magic_circle_decal_back.Face = "Back"
3389
                magic_circle_decal_back.Texture = "rbxassetid://122610943"
3390
                magic_circle_decal_front.Face = "Front"
3391
                magic_circle_decal_front.Texture = "rbxassetid://122610943"
3392
                local function NextExplosion()
3393
                        explosionCount = explosionCount + 1
3394
                        Instance.new("Explosion", Workspace).Position = origin + direction * (explosionCount * 8 + 4)
3395
                end
3396
                local function AnimateMagicCircle()
3397
                        animation_frame = animation_frame + 1
3398
                        local transparency = (animation_frame / 40) ^ 3
3399
                        if animation_frame == 40 then
3400
                                pcall(Game.Destroy, magic_circle_part)
3401
                        else
3402
                                if magic_circle_part.Parent ~= Workspace then
3403
                                        pcall(Utility.SetProperty, magic_circle_part, "Parent", Workspace)
3404
                                end
3405
                                head = PlayerControl.GetHead()
3406
                                if head then
3407
                                        magic_circle_position = head.Position + direction * 4
3408
                                end
3409
                                magic_circle_part.CFrame = CFrame.new(magic_circle_position, magic_circle_position + direction) * CFrame.Angles(0, 0,
3410
 
3411
math.tau * animation_frame / 40 * 1.5)
3412
                                magic_circle_light.Brightness = 1 - transparency
3413
                                magic_circle_decal_back.Transparency = transparency
3414
                                magic_circle_decal_front.Transparency = transparency
3415
                        end
3416
                end
3417
                magic_circle_part.Parent = Workspace
3418
                for i = 1, 40 do
3419
                        Delay((i - 1) / ControllerCommands.BALEFIRE_SPEED, NextExplosion)
3420
                        Delay((i - 1) / 30, AnimateMagicCircle)
3421
                end
3422
                for i = 1, 20 do
3423
                        Delay((i - 1) / ControllerCommands.BALEFIRE_SPEED, NextExplosion)
3424
                end
3425
        end
3426
end
3427
function ControllerCommands.ControlRandomDummy()
3428
        local dummies = {}
3429
        local numDummies = 0
3430
        for _, character in ipairs(Workspace:GetChildren()) do
3431
                local name = tostring(character)
3432
                if name == "???" or name == "Dummy" then
3433
                        local head, humanoid
3434
                        for _, child in ipairs(character:GetChildren()) do
3435
                                local className = child.ClassName
3436
                                if className == "Part" and tostring(child) == "Head" then
3437
                                        head = child
3438
                                        if humanoid then
3439
                                                break
3440
                                        end
3441
                                elseif className == "Humanoid" then
3442
                                        if child.Health > 0 then
3443
                                                humanoid = child
3444
                                                if head then
3445
                                                        break
3446
                                                end
3447
                                        else
3448
                                                break
3449
                                        end
3450
                                end
3451
                        end
3452
                        if head and humanoid then
3453
                                numDummies = numDummies + 1
3454
                                dummies[numDummies] = {character, head, humanoid}
3455
                        end
3456
                end
3457
        end
3458
        if numDummies > 0 then
3459
                local dummy = dummies[math.random(numDummies)]
3460
                Player.Character = dummy[1]
3461
                chatAdornee = dummy[2]
3462
                Camera.CameraSubject = dummy[3]
3463
                Camera.CameraType = "Track"
3464
        end
3465
end
3466
function ControllerCommands.Decalify(textures, exclusion)
3467
        local objects = Workspace:GetChildren()
3468
        for _, object in ipairs(objects) do
3469
                if not exclusion[object] then
3470
                        for _, child in ipairs(object:GetChildren()) do
3471
                                objects[#objects + 1] = child
3472
                        end
3473
                        if object:IsA("BasePart") then
3474
                                local texture = textures[math.random(#textures)]
3475
                                local face_left = Instance.new("Decal", object)
3476
                                face_left.Face = Enum.NormalId.Left
3477
                                face_left.Texture = texture
3478
                                local face_right = Instance.new("Decal", object)
3479
                                face_right.Face = Enum.NormalId.Right
3480
                                face_right.Texture = texture
3481
                                local face_bottom = Instance.new("Decal", object)
3482
                                face_bottom.Face = Enum.NormalId.Bottom
3483
                                face_bottom.Texture = texture
3484
                                local face_top = Instance.new("Decal", object)
3485
                                face_top.Face = Enum.NormalId.Top
3486
                                face_top.Texture = texture
3487
                                local face_front = Instance.new("Decal", object)
3488
                                face_front.Face = Enum.NormalId.Front
3489
                                face_front.Texture = texture
3490
                                local face_back = Instance.new("Decal", object)
3491
                                face_back.Face = Enum.NormalId.Back
3492
                                face_back.Texture = texture
3493
                        end
3494
                end
3495
        end
3496
end
3497
 
3498
function ControllerCommands.ExplodeAtMouse()
3499
        local explosion = Instance.new("Explosion")
3500
        explosion.Position = Mouse.Hit.p
3501
        explosion.Parent = Workspace
3502
end
3503
function ControllerCommands.LaserAtMouse()
3504
        GraphicalEffects.ShootLaserOfDeath(Mouse.Hit.p)
3505
end
3506
function ControllerCommands.BigLaser(target)
3507
        GraphicalEffects.ShootLaserOfDeath(target, {brickcolor = BrickColor.new("New Yeller"), duration = 80, fragmentation_size = 6,laser_scale = 30, light_color = Color3.new(1, 0.5, 0), magic_circle_image = "rbxassetid://126561317", magic_circle_scale = 1.5, sound_volume = 1,special_effects = BrickColor.new("Deep orange"), stay = 2})
3508
end
3509
function ControllerCommands.BigLaserAtMouse()
3510
        ControllerCommands.BigLaser(Mouse.Hit.p)
3511
end
3512
function ControllerCommands.ShootMissile(targetPart, pointOnPart, direction)
3513
        GraphicalEffects.ShootMissile(targetPart, pointOnPart, direction)
3514
end
3515
function ControllerCommands.ShootMissileAtMouse(amount, spread, delayTime)
3516
        local exclusionList = {}
3517
        local playerHead = PlayerControl.GetHead()
3518
        local playerTorso = PlayerControl.GetTorso()
3519
        if playerHead and playerTorso then
3520
                exclusionList[playerTorso] = true
3521
                local humanoid, torso = Utility.FindHumanoidClosestToRay(Mouse.UnitRay, exclusionList)
3522
                local targetPart, pointOnPart
3523
                if humanoid and torso then
3524
                        targetPart, pointOnPart = torso, Vector3.new()
3525
                else
3526
                        local target = Mouse.Target
3527
                        if target then
3528
                                targetPart, pointOnPart = target, target.CFrame:pointToObjectSpace(Mouse.Hit.p)
3529
                        else
3530
                                return
3531
                        end
3532
                end
3533
                if targetPart then
3534
                        local direction = (Mouse.Hit.p - playerHead.Position).unit
3535
                        delayTime = delayTime or 0
3536
                        for index = 1, amount do
3537
                                local angles = math.tau * (index - 0.5) * spread / amount * Vector3.new(math.random() - 0.5, math.random() - 0.5,math.random() - 0.5).unit
3538
                                TaskScheduler.Schedule(delayTime * (index - 1), ControllerCommands.ShootMissile, targetPart, pointOnPart, CFrame.Angles(angles.X, angles.Y, angles.Z) * direction)
3539
                        end
3540
                end
3541
        end
3542
end
3543
function ControllerCommands.ShootMissileAroundMouse(amount, offset, delayTime)
3544
        local exclusionList = {}
3545
        local playerHead = PlayerControl.GetHead()
3546
        local playerTorso = PlayerControl.GetTorso()
3547
        if playerHead and playerTorso then
3548
                exclusionList[playerTorso] = true
3549
                local humanoid, torso = Utility.FindHumanoidClosestToRay(Mouse.UnitRay, exclusionList)
3550
                local targetPart, pointOnPart
3551
                if humanoid and torso then
3552
                        targetPart, pointOnPart = torso, Vector3.new()
3553
                else
3554
                        local target = Mouse.Target
3555
                        if target then
3556
                                targetPart, pointOnPart = target, target.CFrame:pointToObjectSpace(Mouse.Hit.p)
3557
                        else
3558
                                return
3559
                        end
3560
                end
3561
                if targetPart then
3562
                        delayTime = delayTime or 0
3563
                        local index = 1
3564
                        local targetPoint = targetPart.CFrame * pointOnPart
3565
                        local rotation_offset_angles = math.tau * Vector3.new(math.random() - 0.5, math.random() - 0.5, 0).unit
3566
                        local rotation_offset = CFrame.Angles(rotation_offset_angles.x, rotation_offset_angles.y, 0)
3567
                        local angle_x = 0
3568
                        local angle_x_step = math.tau / math.phi
3569
                        for i = 1, 8 * amount do
3570
                                angle_x = angle_x + angle_x_step
3571
                                local direction = rotation_offset * (CFrame.Angles(0, math.tau * index / amount, 0) * CFrame.Angles(angle_x, 0,0).lookVector)
3572
                                local blocked = Workspace:FindPartOnRay(Ray.new(targetPoint, direction * offset), targetPart.Parent)
3573
                                if not blocked then
3574
                                        local p0, p1, p2, p3 = targetPart, pointOnPart, direction, offset; GraphicalEffects.ShootMissile(p0, p1, p2, function() return p0 end, p3, true)
3575
                                        index = index + 1
3576
                                        if index > amount then
3577
                                                break
3578
                                        end
3579
                                end
3580
                        end
3581
                end
3582
        end
3583
end
3584
 
3585
function ControllerCommands.HugeExplosionOfDoom(position)
3586
        local connections = {}
3587
        local parts = {}
3588
        local cframe = CFrame.new(position)
3589
        local function ExplosionHit(part)
3590
                if part:GetMass() < 10000 and part.Parent ~= Camera then
3591
                        parts[part] = true
3592
                        part.Anchored = true
3593
                        part:BreakJoints()
3594
                        part.BrickColor = BrickColor.new("Instituational white")
3595
                end
3596
        end
3597
        for i = 1, 4 do
3598
                local quantity = 0.5 * i * (1 + i)
3599
                local fraction = math.tau / quantity
3600
                for x = 1, quantity do
3601
                        for y = 1, quantity do
3602
                                local explosion = Instance.new("Explosion")
3603
                                connections[#connections + 1] = explosion.Hit:connect(ExplosionHit)
3604
                                explosion.BlastRadius = 5
3605
                                explosion.Position = cframe * (CFrame.Angles(fraction * x, fraction * y, 0) * Vector3.new((i - 1) * 6, 0, 0))
3606
                                explosion.Parent = Workspace
3607
                        end
3608
                end
3609
                wait(0.075)
3610
        end
3611
        for part in pairs(parts) do
3612
                for _, child in ipairs(part:GetChildren()) do
3613
                        if child:IsA("BodyMover") then
3614
                                child:Destroy()
3615
                        end
3616
                end
3617
                local mass = part:GetMass()
3618
                local velocity = CFrame.Angles(math.tau * math.random(), math.tau * math.random(), 0) * Vector3.new(25, 0, 0)
3619
                local bodythrust = Instance.new("BodyThrust")
3620
                bodythrust.force = mass * -velocity
3621
                bodythrust.Parent = part
3622
                local bodyforce = Instance.new("BodyForce")
3623
                bodyforce.force = mass * Vector3.new(0, 196.2, 0)
3624
                bodyforce.Parent = part
3625
                part.Anchored = false
3626
                part.Reflectance = 1
3627
                part.RotVelocity = math.tau * Vector3.new(math.random() - 0.5, math.random() - 0.5, math.random() - 0.5)
3628
                part.Transparency = 0.5
3629
                part.Velocity = (part.CFrame - part.Position) * velocity
3630
        end
3631
        for _, connection in ipairs(connections) do
3632
                connection:disconnect()
3633
        end
3634
        for i = 0, 99 do
3635
                Delay(i / 10, function()
3636
                        for part in pairs(parts) do
3637
                                local new_transparency = 0.5 * (1 + i / 50)
3638
                                part.Reflectance = 0.98 * part.Reflectance
3639
                                if new_transparency > part.Transparency then
3640
                                        part.Transparency = new_transparency
3641
                                end
3642
                        end
3643
                end)
3644
        end
3645
        Delay(10, function()
3646
                for part in pairs(parts) do
3647
                        pcall(part.Destroy, part)
3648
                end
3649
        end)
3650
end
3651
function ControllerCommands.HugeExplosionOfDoomAtMouse()
3652
        ControllerCommands.HugeExplosionOfDoom(Mouse.Hit.p)
3653
end
3654
 
3655
function ControllerCommands.SpaceHyperBeam(asd)
3656
        GraphicalEffects.SpaceHyperBeam(asd)
3657
end
3658
function ControllerCommands.SpaceHyperBeamAtMouse()
3659
        ControllerCommands.SpaceHyperBeam(Mouse.Hit.p)
3660
end
3661
function ControllerCommands.ConcentratedSpaceHyperBeamAtMouse()
3662
        local p = Mouse.Hit.p; for i = 1, 50 do GraphicalEffects.SpaceHyperBeam(p) end
3663
end
3664
 
3665
function ControllerCommands.TeleportCharacterToMouse()
3666
        if PlayerControl.IsEnabled() then
3667
                local torso = PlayerControl.GetTorso()
3668
                if torso then
3669
                        local pos = Mouse.Hit.p + Vector3.new(0, 5, 0)
3670
                        torso.CFrame = CFrame.new(pos, pos + torso.CFrame.lookVector)
3671
                end
3672
        else
3673
                local new_focus_position = Mouse.Hit.p
3674
                local direction_vector = Camera.CoordinateFrame.lookVector
3675
                local new_focus = CFrame.new(new_focus_position, new_focus_position + direction_vector)
3676
                Camera.CoordinateFrame = new_focus * CFrame.new(0, 0, 25)
3677
                Camera.Focus = new_focus
3678
        end
3679
end
3680
 
3681
AdvancedGUI = {};
3682
 
3683
if not AdvancedGUI.GUI_BASE_COLOR then
3684
        AdvancedGUI.GUI_BASE_COLOR = Color3.new(0, 0, 0)
3685
end
3686
function AdvancedGUI.GenerateChatColor(speakerName)
3687
        local chatColor = ChatColor.Get(speakerName).Color
3688
        local brightness = chatColor.r + chatColor.g + chatColor.b
3689
        if brightness < 1.5 then
3690
                chatColor = Color3.new(math.min(1, 0.4 + chatColor.r), math.min(1, 0.4 + chatColor.g), math.min(1, 0.4 + chatColor.b))
3691
        else
3692
                chatColor = Color3.new(math.min(1, 0.05 + chatColor.r), math.min(1, 0.05 + chatColor.g), math.min(1, 0.05 + chatColor.b))
3693
        end
3694
        return chatColor
3695
end
3696
GuiBase = {}
3697
GuiBase.__index = GuiBase
3698
function GuiBase:new(data)
3699
        local instance = setmetatable({}, self)
3700
        instance:Init(data)
3701
        return instance
3702
end
3703
function GuiBase:Destroy()
3704
        if self.parent then
3705
                self.parent.children[self] = nil
3706
        end
3707
        for child in pairs(self.children) do
3708
                child:Destroy()
3709
        end
3710
        self.m_base_instance:Destroy()
3711
end
3712
function GuiBase:GetContentInstance(child)
3713
        return self.m_base_instance
3714
end
3715
function GuiBase:Init()
3716
        self.children = {}
3717
end
3718
function GuiBase:IsA(className)
3719
        return className == "GuiBase"
3720
end
3721
function GuiBase:SetParent(parent)
3722
        if parent ~= self.parent then
3723
                if self.parent then
3724
                        self.parent.children[self] = nil
3725
                end
3726
                self.parent = parent
3727
                if parent then
3728
                        parent.children[self] = true
3729
                        self.m_base_instance.Parent = parent:GetContentInstance()
3730
                else
3731
                        self.m_base_instance.Parent = nil
3732
                end
3733
        end
3734
end
3735
GuiObject = setmetatable({}, GuiBase)
3736
GuiObject.__index = GuiObject
3737
function GuiObject:Destroy()
3738
        self.DragBegin:disconnect()
3739
        self.DragMove:disconnect()
3740
        self.DragStopped:disconnect()
3741
        self.MouseButton1Click:disconnect()
3742
        self.MouseButton1Down:disconnect()
3743
        self.MouseButton1Up:disconnect()
3744
        self.MouseButton2Down:disconnect()
3745
        self.MouseButton2Up:disconnect()
3746
        self.MouseEnter:disconnect()
3747
        self.MouseLeave:disconnect()
3748
        GuiBase.Destroy(self)
3749
end
3750
function GuiObject:GetAbsolutePosition()
3751
        return self.m_base_instance.AbsolutePosition
3752
end
3753
function GuiObject:GetAbsoluteSize()
3754
        return self.m_base_instance.AbsoluteSize
3755
end
3756
function GuiObject:GetPosition()
3757
        return self.position
3758
end
3759
function GuiObject:GetSize()
3760
        return self.size
3761
end
3762
function GuiObject:Init()
3763
        GuiBase.Init(self)
3764
        self.mouseDown = false
3765
        self.mouseOver = false
3766
        self.DragBegin = RbxUtility.CreateSignal()
3767
        self.DragMove = RbxUtility.CreateSignal()
3768
        self.DragStopped = RbxUtility.CreateSignal()
3769
        self.MouseButton1Click = RbxUtility.CreateSignal()
3770
        self.MouseButton1Down = RbxUtility.CreateSignal()
3771
        self.MouseButton1Up = RbxUtility.CreateSignal()
3772
        self.MouseButton2Down = RbxUtility.CreateSignal()
3773
        self.MouseButton2Up = RbxUtility.CreateSignal()
3774
        self.MouseEnter = RbxUtility.CreateSignal()
3775
        self.MouseLeave = RbxUtility.CreateSignal()
3776
end
3777
function GuiObject:IsA(className)
3778
        return className == "GuiObject" or GuiBase.IsA(self, className)
3779
end
3780
function GuiObject:SetActive(active)
3781
        if active ~= self.active then
3782
                self.active = active
3783
        end
3784
end
3785
function GuiObject:SetBackgroundTransparency(backgroundTransparency)
3786
        if backgroundTransparency ~= self.backgroundTransparency then
3787
                self.backgroundTransparency = backgroundTransparency
3788
                self.m_base_instance.BackgroundTransparency = backgroundTransparency
3789
        end
3790
end
3791
function GuiObject:SetColor(color)
3792
        if color ~= self.color then
3793
                self.color = color
3794
                self.m_base_instance.BackgroundColor3 = color
3795
        end
3796
end
3797
function GuiObject:SetPosition(position)
3798
        if position ~= self.position then
3799
                self.position = position
3800
                self.m_base_instance.Position = position
3801
        end
3802
end
3803
function GuiObject:SetSize(size)
3804
        if size ~= self.size then
3805
                self.size = size
3806
                self.m_base_instance.Size = size
3807
        end
3808
end
3809
function GuiObject:SetVisible(visible)
3810
        if visible ~= self.visible then
3811
                self.visible = visible
3812
                self.m_base_instance.Visible = visible
3813
        end
3814
end
3815
function GuiObject:SetZIndex(zIndex)
3816
        local stack = {self.m_base_instance}
3817
        repeat
3818
                local object = stack[#stack]
3819
                stack[#stack] = nil
3820
                for _, child in ipairs(object:GetChildren()) do
3821
                        stack[#stack + 1] = child
3822
                end
3823
                object.ZIndex = zIndex
3824
        until #stack == 0
3825
end
3826
GuiServiceClass = setmetatable({}, GuiBase)
3827
GuiServiceClass.__index = GuiServiceClass
3828
function GuiServiceClass:CreateTextArea(text, font, fontSize, textColor3, textXAlignment, textYAlignment, maxWidth, minWidth)
3829
        local totalHeight = 0
3830
        local frame = Instance.new("Frame")
3831
        frame.BackgroundTransparency = 1
3832
        local label = Instance.new("TextLabel")
3833
        label.BackgroundTransparency = 1
3834
        label.Font = font
3835
        label.FontSize = fontSize
3836
        label.TextColor3 = textColor3
3837
        label.TextTransparency = 1
3838
        label.TextWrapped = true
3839
        label.TextXAlignment = textXAlignment
3840
        label.TextYAlignment = textYAlignment
3841
        label.Parent = self.guiFrame
3842
        local index = 1
3843
        while true do
3844
                local length = #text - index + 1
3845
                if length > 1024 then
3846
                        length = 1024
3847
                        local textBlock = string.sub(text, index, index + length - 1)
3848
                        label.Text = textBlock
3849
                        local height = 0
3850
                        local width = maxWidth
3851
                        repeat
3852
                                height = height + 20
3853
                                label.Size = UDim2.new(0, width, 0, height)
3854
                        until label.TextFits
3855
                        repeat
3856
                                height = height - 1
3857
                                label.Size = UDim2.new(0, width, 0, height)
3858
                        until not label.TextFits
3859
                        repeat
3860
                                length = length - 10
3861
                                label.Text = string.sub(text, index, index + length - 1)
3862
                        until label.TextFits
3863
                        repeat
3864
                                length = length + 1
3865
                                label.Text = string.sub(text, index, index + length - 1)
3866
                        until not label.TextFits
3867
                        local overflowCharacter = string.sub(text, index + length - 1, index + length - 1)
3868
                        length = length - 1
3869
                        label.Text = string.sub(text, index, index + length - 1)
3870
                        if overflowCharacter == "\n" then
3871
                                index = index + 1
3872
                        end
3873
                        repeat
3874
                                height = height - 1
3875
                                label.Size = UDim2.new(0, width, 0, height)
3876
                        until not label.TextFits
3877
                        height = height + 1
3878
                        local blockLabel = label:Clone()
3879
                        blockLabel.Position = UDim2.new(0, 0, 0, totalHeight)
3880
                        blockLabel.Size = UDim2.new(1, 0, 0, height)
3881
                        blockLabel.Parent = frame
3882
                        totalHeight = totalHeight + height
3883
                        index = index + length
3884
                else
3885
                        local textBlock = string.sub(text, index)
3886
                        label.Text = textBlock
3887
                        local height = 0
3888
                        local width = maxWidth
3889
                        repeat
3890
                                height = height + 20
3891
                                label.Size = UDim2.new(0, width, 0, height)
3892
                        until label.TextFits
3893
                        repeat
3894
                                height = height - 1
3895
                                label.Size = UDim2.new(0, width, 0, height)
3896
                        until not label.TextFits
3897
                        height = height + 1
3898
                        if index == 1 then
3899
                                repeat
3900
                                        width =  width - 10
3901
                                        label.Size = UDim2.new(0, width, 0, height)
3902
                                until width < minWidth or not label.TextFits
3903
                                width = math.max(width, minWidth - 1)
3904
                                repeat
3905
                                        width =  width + 1
3906
                                        label.Size = UDim2.new(0, width, 0, height)
3907
                                until label.TextFits
3908
                        end
3909
                        local blockLabel = label:Clone()
3910
                        blockLabel.Position = UDim2.new(0, 0, 0, totalHeight)
3911
                        blockLabel.Size = UDim2.new(1, 0, 0, height)
3912
                        blockLabel.Parent = frame
3913
                        label:Destroy()
3914
                        frame.Size = UDim2.new(0, width, 0, totalHeight + height)
3915
                        return frame
3916
                end
3917
        end
3918
end
3919
function GuiServiceClass:Destroy()
3920
        self.running = false
3921
        self.cameraPart:Destroy()
3922
        self.cameraConnection:disconnect()
3923
        self.keyDownConnection:disconnect()
3924
        self.mouseButton1DownConnection:disconnect()
3925
        self.mouseButton1UpConnection:disconnect()
3926
        self.mouseButton2DownConnection:disconnect()
3927
        self.mouseButton2UpConnection:disconnect()
3928
        self.mouseMoveConnection:disconnect()
3929
        self.steppedConnection:disconnect()
3930
end
3931
function GuiServiceClass:GetMousePosition()
3932
        local mouse = self.mouse
3933
        return mouse.X, mouse.Y -- mouse.X, mouse.Y + 2 -- return mouse.X - 2, mouse.Y - 3
3934
end
3935
function GuiServiceClass:GetTextBounds(text, font, fontSize, alignX, alignY, width)
3936
        local tempLabel = self.tempLabel
3937
        tempLabel.Font = font
3938
        tempLabel.FontSize = fontSize
3939
        tempLabel.Size = UDim2.new(0, width, 0, 4096)
3940
        tempLabel.Text = text
3941
        tempLabel.TextXAlignment = alignX
3942
        tempLabel.TextYAlignment = alignY
3943
        local textBounds = tempLabel.TextBounds
3944
        tempLabel.Text = ""
3945
        return textBounds
3946
end
3947
function GuiServiceClass:Init(data)
3948
        GuiBase.Init(self)
3949
        local _ = string.char
3950
        local camera = data.Camera
3951
        local mouse = data.Mouse
3952
        local cameraPart = Instance.new("Part")
3953
        local billboardGui = Instance.new("BillboardGui", cameraPart)
3954
        guiFrame = Instance.new("Frame", billboardGui)
3955
        cameraPart.Anchored = true
3956
        cameraPart.BottomSurface = "Smooth"
3957
        cameraPart.CanCollide = false
3958
--      cameraPart.CFrame = CFrame.new(16384, 16384, 16384)
3959
        cameraPart.FormFactor = "Custom"
3960
        cameraPart.Locked = true
3961
        cameraPart.Size = Vector3.new(0.2, 0.2, 0.2)
3962
        cameraPart.TopSurface = "Smooth"
3963
        cameraPart.Transparency = 1
3964
        billboardGui.Adornee = cameraPart
3965
        billboardGui.AlwaysOnTop = true
3966
--      billboardGui.ExtentsOffset = Vector3.new(-16384, -16384, -16384)
3967
        guiFrame.BackgroundTransparency = 1
3968
        cameraPart.Parent = camera
3969
        self.running = true
3970
        self.m_base_instance = guiFrame
3971
        self.billboardGui = billboardGui
3972
        self.cameraPart = cameraPart
3973
        self.tempLabel = RBXInstance.new "TextLabel" {
3974
                BackgroundTransparency = 1,
3975
                TextTransparency = 1,
3976
                TextWrapped = true,
3977
                Parent = guiFrame
3978
        }
3979
        self.mnemonics = {}
3980
        self.visible = true
3981
        self.camera = camera
3982
        self.mouse = mouse
3983
        self.cameraConnection = camera.Changed:connect(function(property)
3984
                self:UpdateView()
3985
                if property == "CameraType" then
3986
                        if camera.CameraType ~= Enum.CameraType.Track and camera.CameraType ~= Enum.CameraType.Fixed then
3987
                                camera.CameraType = Enum.CameraType.Track
3988
                        end
3989
                elseif property == "CoordinateFrame" and camera.CameraType ~= Enum.CameraType.Fixed then
3990
                        local cframe, focus = camera.CoordinateFrame, camera.Focus
3991
                        local watchOffset = focus.p - cframe.p
3992
                        local error = watchOffset.unit - cframe.lookVector
3993
                        if error.magnitude >= 1e-3 then
3994
                                local head = PlayerControl.GetHead()
3995
                                local time1, velocity1
3996
                                if head then
3997
                                        time1 = time()
3998
                                        velocity1 = head.Velocity
3999
                                end
4000
                                if camera.Changed:wait() == "CoordinateFrame" then
4001
                                        local position = cframe.p
4002
                                        if head then
4003
                                                local time2 = time()
4004
                                                local velocity2 = head.Velocity
4005
                                                position = position + 0.5 * (velocity1 + velocity2) * (time2 - time1)
4006
                                        end
4007
                                        camera.CoordinateFrame = CFrame.new(position, camera.Focus.p)
4008
                                end
4009
                        end
4010
                end
4011
        end)
4012
        self.keyDownConnection = mouse.KeyDown:connect(function(key) self:KeyDown(key) end)
4013
        self.mouseButton1DownConnection = mouse.Button1Down:connect(function() self:MouseButton1Down() end)
4014
        self.mouseButton1UpConnection = mouse.Button1Up:connect(function() self:MouseButton1Up() end)
4015
        self.mouseButton2DownConnection = mouse.Button2Down:connect(function() self:MouseButton2Down() end)
4016
        self.mouseButton2UpConnection = mouse.Button2Up:connect(function() self:MouseButton2Up() end)
4017
        self.mouseMoveConnection = mouse.Move:connect(function() self:MouseMove() end)
4018
        self.steppedConnection = RunService.RenderStepped:connect(function() self:UpdateObjects() self:UpdateView() end)
4019
        self.mousePreviousPosition = Vector2.new(self:GetMousePosition())
4020
end
4021
function GuiServiceClass:IsA(className)
4022
        return className == "GuiService" or GuiBase.IsA(self, className)
4023
end
4024
function GuiServiceClass:KeyDown(key)
4025
        local mnemonicButton = self.mnemonics[string.upper(key)]
4026
        if mnemonicButton then
4027
                mnemonicButton.Activated:fire()
4028
        end
4029
end
4030
function GuiServiceClass:MouseButton1Down()
4031
        local mouse = self.mouse
4032
        local mouseX, mouseY = self:GetMousePosition()
4033
        local stack = {self}
4034
        local dragObjects = {}
4035
        self.dragObjects = dragObjects
4036
        while #stack > 0 do
4037
                local object = stack[#stack]
4038
                stack[#stack] = nil
4039
                if object.visible then
4040
                        for child in pairs(object.children) do
4041
                                stack[#stack + 1] = child
4042
                        end
4043
                        if object.active then
4044
                                local position = object:GetAbsolutePosition()
4045
                                local size = object:GetAbsoluteSize()
4046
                                if mouseX >= position.X and mouseY >= position.Y and mouseX < position.X + size.X and mouseY < position.Y + size.Y then
4047
                                        object.mouseDown = true
4048
                                        dragObjects[object] = true
4049
                                        local mouseButton1Down = object.MouseButton1Down
4050
                                        if mouseButton1Down then
4051
                                                mouseButton1Down:fire()
4052
                                                if object.autoButtonColor then
4053
                                                        local color = object.color
4054
                                                        local transparency = object.backgroundTransparency
4055
                                                        object.m_base_instance.BackgroundColor3 = Color3.new(math.min(color.r + 0.3, 1), math.min(color.g +
4056
 
4057
0.3, 1), math.min(color.b + 0.3, 1))
4058
                                                        object.m_base_instance.BackgroundTransparency = transparency
4059
                                                end
4060
                                        end
4061
                                        object.DragBegin:fire()
4062
                                end
4063
                        end
4064
                end
4065
        end
4066
        self.mousePreviousPosition = Vector2.new(mouseX, mouseY)
4067
end
4068
function GuiServiceClass:MouseButton1Up()
4069
        local mouse = self.mouse
4070
        local mouseX, mouseY = self:GetMousePosition()
4071
        local stack = {self}
4072
        while #stack > 0 do
4073
                local object = stack[#stack]
4074
                stack[#stack] = nil
4075
                if object.visible then
4076
                        for child in pairs(object.children) do
4077
                                stack[#stack + 1] = child
4078
                        end
4079
                        if object.active then
4080
                                local position = object:GetAbsolutePosition()
4081
                                local size = object:GetAbsoluteSize()
4082
                                if mouseX >= position.X and mouseY >= position.Y and mouseX < position.X + size.X and mouseY < position.Y + size.Y then
4083
                                        object.MouseButton1Up:fire()
4084
                                end
4085
                        end
4086
                end
4087
        end
4088
        local dragObjects = self.dragObjects
4089
        self.dragObjects = nil
4090
        if dragObjects then
4091
                for dragObject in pairs(dragObjects) do
4092
                        dragObject.mouseDown = false
4093
                        local position = dragObject:GetAbsolutePosition()
4094
                        local size = dragObject:GetAbsoluteSize()
4095
                        if mouseX >= position.X and mouseY >= position.Y and mouseX < position.X + size.X and mouseY < position.Y + size.Y then
4096
                                dragObject.MouseButton1Click:fire()
4097
                                local activated = dragObject.Activated
4098
                                if activated then
4099
                                        activated:fire()
4100
                                end
4101
                        end
4102
                        dragObject.DragStopped:fire()
4103
                        if dragObject.autoButtonColor then
4104
                                if dragObject.mouseOver then
4105
                                        local color = dragObject.color
4106
                                        local transparency = dragObject.backgroundTransparency
4107
                                        dragObject.m_base_instance.BackgroundColor3 = Color3.new(math.max(color.r - 0.3, 0), math.max(color.g - 0.3, 0),
4108
 
4109
math.max(color.b - 0.3, 0))
4110
                                        dragObject.m_base_instance.BackgroundTransparency = math.max(0, transparency - 0.2)
4111
                                else
4112
                                        dragObject.m_base_instance.BackgroundColor3 = dragObject.color
4113
                                        dragObject.m_base_instance.BackgroundTransparency = dragObject.backgroundTransparency
4114
                                end
4115
                        end
4116
                        self.dragObject = nil
4117
                end
4118
        end
4119
end
4120
function GuiServiceClass:MouseButton2Down()
4121
        local mouse = self.mouse
4122
        local mouseX, mouseY = self:GetMousePosition()
4123
        local stack = {self}
4124
        while #stack > 0 do
4125
                local object = stack[#stack]
4126
                stack[#stack] = nil
4127
                if object.visible then
4128
                        for child in pairs(object.children) do
4129
                                stack[#stack + 1] = child
4130
                        end
4131
                        if object.active then
4132
                                local position = object:GetAbsolutePosition()
4133
                                local size = object:GetAbsoluteSize()
4134
                                if mouseX >= position.X and mouseY >= position.Y and mouseX < position.X + size.X and mouseY < position.Y + size.Y then
4135
                                        local mouseButton2Down = object.MouseButton2Down
4136
                                        if mouseButton2Down then
4137
                                                mouseButton2Down:fire()
4138
                                        end
4139
                                end
4140
                        end
4141
                end
4142
        end
4143
        self.mousePreviousPosition = Vector2.new(mouseX, mouseY)
4144
end
4145
function GuiServiceClass:MouseButton2Up()
4146
        local mouse = self.mouse
4147
        local mouseX, mouseY = self:GetMousePosition()
4148
        local stack = {self}
4149
        while #stack > 0 do
4150
                local object = stack[#stack]
4151
                stack[#stack] = nil
4152
                if object.visible then
4153
                        for child in pairs(object.children) do
4154
                                stack[#stack + 1] = child
4155
                        end
4156
                        if object.active then
4157
                                local position = object:GetAbsolutePosition()
4158
                                local size = object:GetAbsoluteSize()
4159
                                if mouseX >= position.X and mouseY >= position.Y and mouseX < position.X + size.X and mouseY < position.Y + size.Y then
4160
                                        local mouseButton2Up = object.MouseButton2Up
4161
                                        if mouseButton2Up then
4162
                                                mouseButton2Up:fire()
4163
                                        end
4164
                                end
4165
                        end
4166
                end
4167
        end
4168
end
4169
function GuiServiceClass:MouseMove()
4170
        self:UpdateObjects()
4171
        local dragObjects = self.dragObjects
4172
        if dragObjects then
4173
                for dragObject in pairs(dragObjects) do
4174
                        local mouse = self.mouse
4175
                        local mousePosition = Vector2.new(self:GetMousePosition())
4176
                        dragObject.DragMove:fire(mousePosition - self.mousePreviousPosition)
4177
                        self.mousePreviousPosition = mousePosition
4178
                end
4179
        end
4180
end
4181
function GuiServiceClass:SetMnemonic(mnemonic, button)
4182
        self.mnemonics[mnemonic] = button
4183
end
4184
function GuiServiceClass:UpdateObjects()
4185
        local mouse = self.mouse
4186
        local mouseX, mouseY = self:GetMousePosition()
4187
        local stack = {self}
4188
        while #stack > 0 do
4189
                local object = stack[#stack]
4190
                stack[#stack] = nil
4191
                if object.visible then
4192
                        for child in pairs(object.children) do
4193
                                stack[#stack + 1] = child
4194
                        end
4195
                        if object.active then
4196
                                local position = object:GetAbsolutePosition()
4197
                                local size = object:GetAbsoluteSize()
4198
                                if mouseX >= position.X and mouseY >= position.Y and mouseX < position.X + size.X and mouseY < position.Y + size.Y then
4199
                                        if not object.mouseOver then
4200
                                                object.mouseOver = true
4201
                                                object.MouseEnter:fire()
4202
                                                if object.autoButtonColor then
4203
                                                        local color = object.color
4204
                                                        local transparency = object.backgroundTransparency
4205
                                                        if object.mouseDown then
4206
                                                                object.m_base_instance.BackgroundColor3 = Color3.new(math.min(color.r + 0.3, 1), math.min(color.g + 0.3, 1), math.min(color.b + 0.3, 1))
4207
                                                                object.m_base_instance.BackgroundTransparency = transparency
4208
                                                        else
4209
                                                                object.m_base_instance.BackgroundColor3 = Color3.new(math.max(color.r - 0.3, 0), math.max(color.g - 0.3, 0), math.max(color.b - 0.3, 0))
4210
                                                                object.m_base_instance.BackgroundTransparency = math.max(0, transparency - 0.2)
4211
                                                        end
4212
                                                end
4213
                                        end
4214
                                else
4215
                                        if object.mouseOver then
4216
                                                object.mouseOver = false
4217
                                                object.MouseLeave:fire()
4218
                                                if object.autoButtonColor then
4219
                                                        object.m_base_instance.BackgroundColor3 = object.color
4220
                                                        object.m_base_instance.BackgroundTransparency = object.backgroundTransparency
4221
                                                end
4222
                                        end
4223
                                end
4224
                        end
4225
                end
4226
        end
4227
end
4228
function GuiServiceClass:UpdateView()
4229
        local billboardGui = self.billboardGui
4230
        local guiFrame = self.m_base_instance
4231
        local camera = self.camera
4232
        local mouse = self.mouse
4233
        local cameraCFrame = CFrame.new(camera.CoordinateFrame.p, camera.Focus.p) -- camera.CoordinateFrame
4234
        local viewSizeX, viewSizeY = mouse.ViewSizeX, mouse.ViewSizeY
4235
        local previousViewSize = self.viewSize
4236
        if not previousViewSize or ((viewSizeX ~= 0 or viewSizeY ~= 0) and (viewSizeX ~= previousViewSize.X or viewSizeY ~= previousViewSize.Y)) then
4237
                self.viewSize = {X = viewSizeX, Y = viewSizeY}
4238
                local viewSizeUDim2 = UDim2.new(0, viewSizeX, 0, viewSizeY)
4239
                billboardGui.Size = viewSizeUDim2
4240
                guiFrame.Size = viewSizeUDim2
4241
                -- FIXME:
4242
                -- After the 15th of July 2014, there came an offset at the Y thingy out of nowhere so I accomodated for that.
4243
                billboardGui.SizeOffset = Vector2.new(0.5 / viewSizeX, (0.5 + 10) / viewSizeY)
4244
        end
4245
        --billboardGui.SizeOffset = Vector2.new()
4246
        billboardGui.StudsOffset = (cameraCFrame - cameraCFrame.p):inverse() * cameraCFrame.p - Vector3.new(0, 0, 1)
4247
end
4248
GuiService = GuiServiceClass:new {
4249
        Camera = Camera,
4250
        Mouse = Mouse
4251
}
4252
GuiFrame = setmetatable({}, GuiObject)
4253
GuiFrame.__index = GuiFrame
4254
GuiFrame.__default = {__index = {
4255
        Active = false,
4256
        BackgroundTransparency = 0.75,
4257
        BorderSize = 4,
4258
        BorderTransparency = 0.75,
4259
        Color = AdvancedGUI.GUI_BASE_COLOR,
4260
        Position = UDim2.new(0, 0, 0, 0),
4261
        Size = UDim2.new(0, 52, 0, 52),
4262
        Visible = true
4263
}}
4264
function GuiFrame:Destroy()
4265
        GuiObject.Destroy(self)
4266
end
4267
function GuiFrame:GetContentInstance()
4268
        return self.m_content_frame
4269
end
4270
function GuiFrame:Init(data)
4271
        GuiObject.Init(self)
4272
        setmetatable(data, GuiFrame.__default)
4273
        local leftBorderFrameLeft = RBXInstance.new "Frame" {
4274
                BackgroundColor3 = Color3.new(0, 0, 0),
4275
                BorderSizePixel = 0,
4276
                Size = UDim2.new(0, 1, 1, -1)
4277
        }
4278
        local leftBorderFrameCenter = RBXInstance.new "Frame" {
4279
                BackgroundColor3 = Color3.new(1, 1, 1),
4280
                BorderSizePixel = 0,
4281
                Position = UDim2.new(0, 1, 0, 1)
4282
        }
4283
        local leftBorderFrameRight = RBXInstance.new "Frame" {
4284
                BackgroundColor3 = Color3.new(0, 0, 0),
4285
                BorderSizePixel = 0
4286
        }
4287
        local rightBorderFrameRight = RBXInstance.new "Frame" {
4288
                BackgroundColor3 = Color3.new(0, 0, 0),
4289
                BorderSizePixel = 0,
4290
                Position = UDim2.new(1, -1, 0, 1),
4291
                Size = UDim2.new(0, 1, 1, -1)
4292
        }
4293
        local rightBorderFrameCenter = RBXInstance.new "Frame" {
4294
                BackgroundColor3 = Color3.new(1, 1, 1),
4295
                BorderSizePixel = 0
4296
        }
4297
        local rightBorderFrameLeft = RBXInstance.new "Frame" {
4298
                BackgroundColor3 = Color3.new(0, 0, 0),
4299
                BorderSizePixel = 0
4300
        }
4301
        local bottomBorderFrameBottom = RBXInstance.new "Frame" {
4302
                BackgroundColor3 = Color3.new(0, 0, 0),
4303
                BorderSizePixel = 0,
4304
                Position = UDim2.new(0, 0, 1, -1),
4305
                Size = UDim2.new(1, -1, 0, 1)
4306
        }
4307
        local bottomBorderFrameCenter = RBXInstance.new "Frame" {
4308
                BackgroundColor3 = Color3.new(1, 1, 1),
4309
                BorderSizePixel = 0
4310
        }
4311
        local bottomBorderFrameTop = RBXInstance.new "Frame" {
4312
                BackgroundColor3 = Color3.new(0, 0, 0),
4313
                BorderSizePixel = 0
4314
        }
4315
        local topBorderFrameTop = RBXInstance.new "Frame" {
4316
                BackgroundColor3 = Color3.new(0, 0, 0),
4317
                BorderSizePixel = 0,
4318
                Position = UDim2.new(0, 1, 0, 0),
4319
                Size = UDim2.new(1, -1, 0, 1)
4320
        }
4321
        local topBorderFrameCenter = RBXInstance.new "Frame" {
4322
                BackgroundColor3 = Color3.new(1, 1, 1),
4323
                BorderSizePixel = 0
4324
        }
4325
        local topBorderFrameBottom = RBXInstance.new "Frame" {
4326
                BackgroundColor3 = Color3.new(0, 0, 0),
4327
                BorderSizePixel = 0
4328
        }
4329
        local border_frame = RBXInstance.new "Frame" {
4330
                BackgroundTransparency = 1,
4331
                Size = UDim2.new(1, 0, 1, 0),
4332
                leftBorderFrameLeft,
4333
                leftBorderFrameCenter,
4334
                leftBorderFrameRight,
4335
                rightBorderFrameLeft,
4336
                rightBorderFrameCenter,
4337
                rightBorderFrameRight,
4338
                bottomBorderFrameBottom,
4339
                bottomBorderFrameCenter,
4340
                bottomBorderFrameTop,
4341
                topBorderFrameBottom,
4342
                topBorderFrameCenter,
4343
                topBorderFrameTop
4344
        }
4345
        local contentFrame = RBXInstance.new "Frame" {
4346
                BackgroundTransparency = 1,
4347
                BorderSizePixel = 0,
4348
                ClipsDescendants = true,
4349
                Size = UDim2.new(1, 0, 1, 0)
4350
        }
4351
        local base_frame = RBXInstance.new "Frame" {
4352
                BorderSizePixel = 0,
4353
                border_frame,
4354
                contentFrame
4355
        }
4356
        self.m_base_instance = base_frame
4357
        self.m_content_frame = contentFrame
4358
        self.m_border_frame = border_frame
4359
        self.leftBorderFrameLeft = leftBorderFrameLeft
4360
        self.leftBorderFrameCenter = leftBorderFrameCenter
4361
        self.leftBorderFrameRight = leftBorderFrameRight
4362
        self.rightBorderFrameLeft = rightBorderFrameLeft
4363
        self.rightBorderFrameCenter = rightBorderFrameCenter
4364
        self.rightBorderFrameRight = rightBorderFrameRight
4365
        self.bottomBorderFrameBottom = bottomBorderFrameBottom
4366
        self.bottomBorderFrameCenter = bottomBorderFrameCenter
4367
        self.bottomBorderFrameTop = bottomBorderFrameTop
4368
        self.topBorderFrameBottom = topBorderFrameBottom
4369
        self.topBorderFrameCenter = topBorderFrameCenter
4370
        self.topBorderFrameTop = topBorderFrameTop
4371
        self:SetActive(data.Active)
4372
        self:SetBackgroundTransparency(data.BackgroundTransparency)
4373
        self:SetBorderSize(data.BorderSize)
4374
        self:SetBorderTransparency(data.BorderTransparency)
4375
        self:SetColor(data.Color)
4376
        self:SetPosition(data.Position)
4377
        self:SetSize(data.Size)
4378
        self:SetVisible(data.Visible)
4379
        self:SetParent(data.Parent)
4380
end
4381
function GuiFrame:IsA(className)
4382
        return className == "GuiFrame" or GuiObject.IsA(self, className)
4383
end
4384
function GuiFrame:SetBorderSize(border_size)
4385
        border_size = math.max(math.floor(border_size + 0.5), 0)
4386
        if border_size ~= self.m_border_size then
4387
                self.m_border_size = border_size
4388
                local border_frame = self.m_border_frame
4389
                local contentFrame = self.m_content_frame
4390
                local leftBorderFrameCenter = self.leftBorderFrameCenter
4391
                local leftBorderFrameRight = self.leftBorderFrameRight
4392
                local rightBorderFrameCenter = self.rightBorderFrameCenter
4393
                local rightBorderFrameLeft = self.rightBorderFrameLeft
4394
                local bottomBorderFrameCenter = self.bottomBorderFrameCenter
4395
                local bottomBorderFrameTop = self.bottomBorderFrameTop
4396
                local topBorderFrameCenter = self.topBorderFrameCenter
4397
                local topBorderFrameBottom = self.topBorderFrameBottom
4398
                contentFrame.Position = UDim2.new(0, border_size, 0, border_size)
4399
                contentFrame.Size = UDim2.new(1, -2 * border_size, 1, -2 * border_size)
4400
                local inner_visible = border_size > 0
4401
                if self.leftBorderFrameLeft.Visible ~= inner_visible then
4402
                        self.rightBorderFrameRight.Visible = inner_visible
4403
                        self.bottomBorderFrameBottom.Visible = inner_visible
4404
                        self.topBorderFrameTop.Visible = inner_visible
4405
                end
4406
                local outer_visible = border_size > 1
4407
                if leftBorderFrameCenter.Visible ~= outer_visible then
4408
                        leftBorderFrameCenter.Visible = outer_visible
4409
                        leftBorderFrameRight.Visible = outer_visible
4410
                        rightBorderFrameCenter.Visible = outer_visible
4411
                        rightBorderFrameLeft.Visible = outer_visible
4412
                        bottomBorderFrameCenter.Visible = outer_visible
4413
                        bottomBorderFrameTop.Visible = outer_visible
4414
                        topBorderFrameCenter.Visible = outer_visible
4415
                        topBorderFrameBottom.Visible = outer_visible
4416
                end
4417
                if outer_visible then
4418
                        leftBorderFrameCenter.Size = UDim2.new(0, border_size - 2, 1, -border_size)
4419
                        leftBorderFrameRight.Position = UDim2.new(0, border_size - 1, 0, border_size - 1)
4420
                        leftBorderFrameRight.Size = UDim2.new(0, 1, 1, 1 - 2 * border_size)
4421
                        rightBorderFrameCenter.Position = UDim2.new(1, 1 - border_size, 0, border_size - 1)
4422
                        rightBorderFrameCenter.Size = UDim2.new(0, border_size - 2, 1, -border_size)
4423
                        rightBorderFrameLeft.Position = UDim2.new(1, -border_size, 0, border_size)
4424
                        rightBorderFrameLeft.Size = UDim2.new(0, 1, 1, 1 - 2 * border_size)
4425
                        bottomBorderFrameCenter.Position = UDim2.new(0, 1, 1, 1 - border_size)
4426
                        bottomBorderFrameCenter.Size = UDim2.new(1, -border_size, 0, border_size - 2)
4427
                        bottomBorderFrameTop.Position = UDim2.new(0, border_size - 1, 1, -border_size)
4428
                        bottomBorderFrameTop.Size = UDim2.new(1, 1 - 2 * border_size, 0, 1)
4429
                        topBorderFrameCenter.Position = UDim2.new(0, border_size - 1, 0, 1)
4430
                        topBorderFrameCenter.Size = UDim2.new(1, -border_size, 0, border_size - 2)
4431
                        topBorderFrameBottom.Position = UDim2.new(0, border_size, 0, border_size - 1)
4432
                        topBorderFrameBottom.Size = UDim2.new(1, 1 - 2 * border_size, 0, 1)
4433
                end
4434
        end
4435
end
4436
function GuiFrame:SetBorderTransparency(borderTransparency)
4437
        self.borderTransparency = borderTransparency
4438
        self.leftBorderFrameLeft.BackgroundTransparency = borderTransparency
4439
        self.leftBorderFrameCenter.BackgroundTransparency = borderTransparency
4440
        self.leftBorderFrameRight.BackgroundTransparency = borderTransparency
4441
        self.rightBorderFrameLeft.BackgroundTransparency = borderTransparency
4442
        self.rightBorderFrameCenter.BackgroundTransparency = borderTransparency
4443
        self.rightBorderFrameRight.BackgroundTransparency = borderTransparency
4444
        self.bottomBorderFrameBottom.BackgroundTransparency = borderTransparency
4445
        self.bottomBorderFrameCenter.BackgroundTransparency = borderTransparency
4446
        self.bottomBorderFrameTop.BackgroundTransparency = borderTransparency
4447
        self.topBorderFrameBottom.BackgroundTransparency = borderTransparency
4448
        self.topBorderFrameCenter.BackgroundTransparency = borderTransparency
4449
        self.topBorderFrameTop.BackgroundTransparency = borderTransparency
4450
end
4451
GuiButton = setmetatable({}, GuiFrame)
4452
GuiButton.__index = GuiButton
4453
GuiButton.__default = {__index = {
4454
        AutoButtonColor = true
4455
}}
4456
function GuiButton:Destroy()
4457
        self.Activated:disconnect()
4458
        GuiFrame.Destroy(self)
4459
end
4460
function GuiButton:Init(data)
4461
        if data.Active == nil then
4462
                data.Active = true
4463
        end
4464
        GuiFrame.Init(self, data)
4465
        setmetatable(data, GuiButton.__default)
4466
        self.Activated = RbxUtility.CreateSignal()
4467
        self:SetAutoButtonColor(data.AutoButtonColor)
4468
end
4469
function GuiButton:IsA(className)
4470
        return className == "GuiButton" or GuiFrame.IsA(self, className)
4471
end
4472
function GuiButton:SetAutoButtonColor(autoButtonColor)
4473
        if autoButtonColor ~= self.autoButtonColor then
4474
                self.autoButtonColor = autoButtonColor
4475
                if autoButtonColor then
4476
                        if self.mouseOver then
4477
                                local color = self.color
4478
                                local transparency = self.backgroundTransparency
4479
                                if self.mouseDown then
4480
                                        self.m_base_instance.BackgroundColor3 = Color3.new(math.min(color.r + 0.3, 1), math.min(color.g + 0.3, 1), math.min(color.b + 0.3, 1))
4481
                                        self.m_base_instance.BackgroundTransparency = transparency
4482
                                else
4483
                                        self.m_base_instance.BackgroundColor3 = Color3.new(math.max(color.r - 0.3, 0), math.max(color.g - 0.3, 0), math.max(color.b - 0.3, 0))
4484
                                        self.m_base_instance.BackgroundTransparency = math.max(0, transparency - 0.5)
4485
                                end
4486
                        end
4487
                else
4488
                        self.m_base_instance.BackgroundColor3 = self.color
4489
                end
4490
        end    
4491
end
4492
GuiTextLabel = setmetatable({}, GuiFrame)
4493
GuiTextLabel.__index = GuiTextLabel
4494
GuiTextLabel.__default = {__index = {
4495
        Font = "ArialBold",
4496
        FontSize = "Size12",
4497
        Text = "",
4498
        TextColor = Color3.new(1, 1, 1),
4499
        TextStrokeColor = Color3.new(0, 0, 0),
4500
        TextStrokeTransparency = 0.6,
4501
        TextWrapped = true
4502
}}
4503
function GuiTextLabel:Destroy()
4504
        GuiFrame.Destroy(self)
4505
end
4506
function GuiTextLabel:Init(data)
4507
        GuiFrame.Init(self, data)
4508
        setmetatable(data, GuiTextLabel.__default)
4509
        local base_instance = self.m_base_instance
4510
        local textLabel = RBXInstance.new "TextLabel" {
4511
                BackgroundTransparency = 1,
4512
                Font = data.Font,
4513
                FontSize = data.FontSize,
4514
                TextColor3 = data.TextColor3,
4515
                TextStrokeColor3 = data.TextStrokeColor3,
4516
                TextStrokeTransparency = data.TextStrokeTransparency,
4517
                TextWrapped = data.TextWrapped
4518
        }
4519
        textLabel.Parent = self:GetContentInstance()
4520
        self.textLabel = textLabel
4521
        self:SetText(data.Text)
4522
end
4523
function GuiTextLabel:IsA(className)
4524
        return className == "GuiTextLabel" or GuiFrame.IsA(self, className)
4525
end
4526
function GuiTextLabel:SetText(text)
4527
        if text ~= self.text then
4528
                self.text = text
4529
                local text_index = 1
4530
                local content_instance = self:GetContentInstance()
4531
                local content_instance_size = content_instance.AbsoluteSize
4532
                local frame = Instance.new("Frame")
4533
                frame.BackgroundTransparency = 1
4534
                local label = Instance.new("TextLabel")
4535
                label.BackgroundTransparency = 1
4536
                label.Font = font
4537
                label.FontSize = fontSize
4538
                label.Size = UDim2.new(0, content_instance_size.X, 0, 1000)
4539
                label.Text = ""
4540
                label.TextColor3 = textColor3
4541
                label.TextTransparency = 1
4542
                label.TextWrapped = true
4543
                label.TextXAlignment = textXAlignment
4544
                label.TextYAlignment = textYAlignment
4545
                label.Parent = self.guiFrame
4546
                local row_length = 0
4547
                local step_size = 256
4548
                for step = 1, 8 do
4549
                        step_size = 0.5 * step_size
4550
                        label.Text = string.sub(text, text_index, text_index + row_length - 1)
4551
                end
4552
        end
4553
end
4554
GuiImageButton = setmetatable({}, GuiButton)
4555
GuiImageButton.__index = GuiImageButton
4556
GuiImageButton.__default = {__index = {
4557
        Image = ""
4558
}}
4559
function GuiImageButton:Destroy()
4560
        GuiButton.Destroy(self)
4561
end
4562
function GuiImageButton:Init(data)
4563
        GuiButton.Init(self, data)
4564
        setmetatable(data, GuiImageButton.__default)
4565
        local content_frame = self.m_content_frame
4566
        local image_label = RBXInstance.new "ImageLabel" {
4567
                BackgroundTransparency = 1,
4568
                Size = UDim2.new(1, 0, 1, 0)
4569
        }
4570
        image_label.Parent = content_frame
4571
        self.m_image_label = image_label
4572
        self:SetImage(data.Image)
4573
end
4574
function GuiImageButton:IsA(className)
4575
        return className == "GuiImageButton" or GuiButton.IsA(self, className)
4576
end
4577
function GuiImageButton:SetImage(image)
4578
        if image ~= self.m_image then
4579
                self.m_image = image
4580
                self.m_image_label.Image = image
4581
        end    
4582
end
4583
GuiTextButton = setmetatable({}, GuiButton)
4584
GuiTextButton.__index = GuiTextButton
4585
GuiTextButton.__default = {__index = {
4586
        Font = Enum.Font.ArialBold,
4587
        FontSize = Enum.FontSize.Size11,
4588
        Text = "Button",
4589
        TextXAlignment = Enum.TextXAlignment.Center
4590
}}
4591
function GuiTextButton:Destroy()
4592
        GuiButton.Destroy(self)
4593
end
4594
function GuiTextButton:GetTextBounds()
4595
        return self.textLabel.TextBounds
4596
end
4597
function GuiTextButton:Init(data)
4598
        GuiButton.Init(self, data)
4599
        setmetatable(data, GuiTextButton.__default)
4600
        local contentFrame = self.m_content_frame
4601
        local mnemonicLabel = RBXInstance.new "TextLabel" {
4602
                BackgroundTransparency = 1,
4603
                Font = "ArialBold",
4604
                FontSize = "Size36",
4605
                Size = UDim2.new(1, 0, 0.7, 0),
4606
                TextColor3 = Color3.new(1, 1, 1),
4607
                TextStrokeColor3 = Color3.new(0, 0, 0),
4608
                TextStrokeTransparency = 0.6,
4609
                TextWrapped = true
4610
        }
4611
        local textLabel = RBXInstance.new "TextLabel" {
4612
                BackgroundTransparency = 1,
4613
                TextColor3 = Color3.new(1, 1, 1),
4614
                TextStrokeColor3 = Color3.new(0, 0, 0),
4615
                TextStrokeTransparency = 0.6,
4616
                TextWrapped = true
4617
        }
4618
        mnemonicLabel.Parent = contentFrame
4619
        textLabel.Parent = contentFrame
4620
        self.mnemonicLabel = mnemonicLabel
4621
        self.textLabel = textLabel
4622
        self:SetFont(data.Font)
4623
        self:SetFontSize(data.FontSize)
4624
        self:SetMnemonic(data.Mnemonic, true)
4625
        self:SetText(data.Text)
4626
        self:SetTextXAlignment(data.TextXAlignment)
4627
end
4628
function GuiTextButton:IsA(className)
4629
        return className == "GuiTextButton" or GuiButton.IsA(self, className)
4630
end
4631
function GuiTextButton:SetFont(font)
4632
        if font ~= self.font then
4633
                self.font = font
4634
                self.textLabel.Font = font
4635
        end
4636
end
4637
function GuiTextButton:SetFontSize(fontSize)
4638
        if fontSize ~= self.fontSize then
4639
                self.fontSize = fontSize
4640
                self.textLabel.FontSize = fontSize
4641
        end
4642
end
4643
function GuiTextButton:SetMnemonic(mnemonic, forceUpdate)
4644
        if mnemonic ~= self.mnemonic or forceUpdate then
4645
                if self.mnemonic then
4646
                        GuiService:SetMnemonic(self.mnemonic, nil)
4647
                end
4648
                if mnemonic then
4649
                        GuiService:SetMnemonic(mnemonic, self)
4650
                end
4651
                self.mnemonic = mnemonic
4652
                local mnemonicLabel = self.mnemonicLabel
4653
                local textLabel = self.textLabel
4654
                if mnemonic then
4655
                        mnemonicLabel.Text = mnemonic
4656
                        textLabel.Size = UDim2.new(1, 0, 0.9, 0)
4657
                        textLabel.TextYAlignment = "Bottom"
4658
                else
4659
                        mnemonicLabel.Text = ""
4660
                        textLabel.Size = UDim2.new(1, 0, 1, 0)
4661
                        textLabel.TextYAlignment = "Center"
4662
                end
4663
        end    
4664
end
4665
function GuiTextButton:SetText(text)
4666
        if text ~= self.text then
4667
                self.text = text
4668
                self.textLabel.Text = text
4669
        end    
4670
end
4671
function GuiTextButton:SetTextXAlignment(textXAlignment)
4672
        if textXAlignment ~= self.textXAlignment then
4673
                self.textXAlignment = textXAlignment
4674
                self.textLabel.TextXAlignment = textXAlignment
4675
        end    
4676
end
4677
GuiWindow = setmetatable({}, GuiObject)
4678
GuiWindow.__index = GuiWindow
4679
GuiWindow.__default = {__index = {
4680
        Active = true,
4681
        BackgroundTransparency = 0.5,
4682
        BorderSize = 4,
4683
        BorderTransparency = 0.5,
4684
        Position = UDim2.new(0, 0, 0, 0),
4685
        Size = UDim2.new(0, 360, 0, 240),
4686
        Title = "Window",
4687
        TitleBarBackgroundTransparency = 0.5,
4688
        TitleBarBorderTransparency = 1,
4689
        Visible = true
4690
}}
4691
function GuiWindow:Init(data)
4692
        GuiObject.Init(self)
4693
        setmetatable(data, GuiFrame.__default)
4694
        local title_bar = GuiTextLabel:new {
4695
                BackgroundTransparency = data.TitleBarBackgroundTransparency,
4696
                BorderTransparency = data.TitleBarBackgroundTransparency,
4697
                Text = data.Title
4698
        }
4699
        local content_frame = GuiFrame:new {
4700
                Active = data.Active,
4701
                BackgroundTransparency = data.BackgroundTransparency,
4702
                BorderSize = data.BorderSize,
4703
                BorderTransparency = data.BorderTransparency
4704
        }
4705
        local base_frame = RBXInstance.new "Frame" {
4706
                BackgroundTransparency = 1,
4707
                BorderSizePixel = 0,
4708
                Position = data.Position,
4709
                Size = data.Size,
4710
                Visible = data.Visible
4711
        }
4712
        self.m_base_frame = base_frame
4713
        self.m_content_frame = content_frame
4714
        self.m_title_bar = title_bar
4715
end
4716
function GuiWindow:IsA(className)
4717
        return className == "GuiWindow" or GuiObject.IsA(self, className)
4718
end
4719
GuiScrollFrame = setmetatable({}, GuiFrame)
4720
GuiScrollFrame.__index = GuiScrollFrame
4721
GuiScrollFrame.__default = {__index = {
4722
        ContentHeight = 0,
4723
        ScrollBarColor = Color3.new(1, 1, 1)
4724
}}
4725
function GuiScrollFrame:Destroy()
4726
        self.m_scroll_bar:Destroy()
4727
        GuiFrame.Destroy(self)
4728
end
4729
function GuiScrollFrame:GetContentInstance()
4730
        return self.m_scroll_frame or GuiFrame.GetContentInstance(self)
4731
end
4732
function GuiScrollFrame:Init(data)
4733
        GuiFrame.Init(self, data)
4734
        setmetatable(data, GuiScrollFrame.__default)
4735
        local scroll_pane = RBXInstance.new "Frame" {
4736
                BackgroundColor3 = Color3.new(1, 1, 1),
4737
                BackgroundTransparency = 0.8,
4738
                BorderSizePixel = 0,
4739
                Position = UDim2.new(1, -20, 0, 0),
4740
                Size = UDim2.new(0, 20, 1, 0),
4741
                Parent = self.m_content_frame
4742
        }
4743
        local scroll_bar = GuiFrame:new {
4744
                Active = true,
4745
                BackgroundTransparency = 0.6,
4746
                BorderTransparency = 0.6,
4747
                Color = data.ScrollBarColor,
4748
                Parent = self
4749
        }
4750
        local scroll_frame = RBXInstance.new "Frame" {
4751
                BackgroundTransparency = 1,
4752
                Parent = self.m_content_frame
4753
        }
4754
        self.m_scroll_bar = scroll_bar
4755
        self.m_scroll_frame = scroll_frame
4756
        self.m_scroll_pane = scroll_pane
4757
        self.m_scroll_position = 0
4758
        self.m_updating_content_height = false
4759
        self:SetContentHeight(data.ContentHeight)
4760
        self:UpdateScrollPosition()
4761
        self.m_scroll_bar.DragBegin:connect(function()
4762
                self.m_scroll_drag_total = Vector2.new()
4763
                self.m_scroll_initial_position = self.m_scroll_position
4764
        end)
4765
        self.m_scroll_bar.DragMove:connect(function(offset)
4766
                self.m_scroll_drag_total = self.m_scroll_drag_total + offset
4767
                local absolute_height = self:GetAbsoluteSize().Y - 2 * self.m_border_size
4768
                if absolute_height ~= 0 then
4769
                        local content_height = math.max(self.m_content_height, absolute_height)
4770
                        local scroll_space = 1 - absolute_height / content_height
4771
                        self:Scroll(self.m_scroll_initial_position + self.m_scroll_drag_total.Y * (content_height / absolute_height - 1) / scroll_space)
4772
                end
4773
        end)
4774
end
4775
function GuiScrollFrame:IsA(className)
4776
        return className == "GuiScrollFrame" or GuiFrame.IsA(self, className)
4777
end
4778
function GuiScrollFrame:Scroll(position)
4779
        position = math.min(math.max(position, 0), self.m_content_height - (self:GetAbsoluteSize().Y - 2 * self.m_border_size))
4780
        if position ~= self.m_scroll_position then
4781
                self.m_scroll_position = position
4782
                self:UpdateScrollPosition()
4783
        end
4784
end
4785
function GuiScrollFrame:SetContentHeight(height)
4786
        if height ~= self.m_content_height then
4787
                local prev_height = self.m_content_height
4788
                self.m_content_height = height
4789
                if not self.m_updating_content_height then
4790
                        self.m_updating_content_height = true
4791
                        coroutine.resume(coroutine.create(function()
4792
                                local success, message = ypcall(self.SetContentHeightImpl1, self, prev_height)
4793
                                if not success then
4794
                                        Logger.printf("Severe", "Error in GuiScrollFrame:SetContentHeight(%s): %s", Utility.ToString(height), message)
4795
                                end
4796
                        end))
4797
                end
4798
        end
4799
end
4800
function GuiScrollFrame:SetContentHeightImpl1(prev_height)
4801
        RunService.RenderStepped:wait()
4802
        self.m_updating_content_height = false
4803
        local height = self.m_content_height
4804
        self.m_scroll_frame.Size = UDim2.new(1, -20, 0, height)
4805
        if prev_height and prev_height ~= 0 then
4806
                local absolute_height = self:GetAbsoluteSize().Y - 2 * self.m_border_size
4807
                if self.m_scroll_position == prev_height - absolute_height then
4808
                        self.m_scroll_position = height - absolute_height
4809
                else
4810
                        self.m_scroll_position = height * self.m_scroll_position / prev_height
4811
                end
4812
        end
4813
        self:UpdateScrollPosition()
4814
end
4815
function GuiScrollFrame:UpdateScrollPosition()
4816
        local absolute_height = self:GetAbsoluteSize().Y - 2 * self.m_border_size
4817
        if absolute_height == 0 then
4818
                absolute_height = self.m_content_height
4819
        end
4820
        local scroll_bar = self.m_scroll_bar
4821
        local scroll_frame = self.m_scroll_frame
4822
        local scroll_pane = self.m_scroll_pane
4823
        local content_height = math.max(self.m_content_height, absolute_height)
4824
        if absolute_height == content_height then
4825
                scroll_frame.Position = UDim2.new(0, 0, 0, 0)
4826
                scroll_frame.Size = UDim2.new(1, 0, 1, 0)
4827
                scroll_bar:SetVisible(false)
4828
                scroll_pane.Visible = false
4829
        else
4830
                local contentScale = content_height / absolute_height
4831
                local scroll_space = 1 - absolute_height / content_height
4832
                local scroll_position = self.m_scroll_position
4833
                scroll_frame.Position = UDim2.new(0, 0, 0, -scroll_position)
4834
                scroll_bar:SetPosition(UDim2.new(1, -20, scroll_position / (content_height - absolute_height) * scroll_space, 0))
4835
                scroll_bar:SetSize(UDim2.new(0, 20, absolute_height / content_height, 0))
4836
                scroll_bar:SetVisible(true)
4837
                scroll_pane.Visible = true
4838
        end
4839
end
4840
GuiMenu = setmetatable({}, GuiFrame)
4841
GuiMenu.__index = GuiMenu
4842
GuiMenu.__default = {__index = {
4843
        VerticalSpacing = 18
4844
}}
4845
function GuiMenu:AddItem(text, onClick, options)
4846
        local frameSize = self:GetSize()
4847
        local frameHeight = frameSize.Y.Offset - self.m_border_size * 2
4848
        local verticalSpacing = self.verticalSpacing
4849
        local properties = {
4850
                BackgroundTransparency = 0.75,
4851
                BorderSize = 0,
4852
                BorderTransparency = 1,
4853
                Color = (#self.menuItems % 2 == 1) and Color3.new(0.25, 0.25, 0.25) or Color3.new(0, 0, 0),
4854
                FontSize = Enum.FontSize.Size12,
4855
                Position = UDim2.new(0, 0, 0, frameHeight),
4856
                Size = UDim2.new(1, 0, 0, verticalSpacing),
4857
                Text = text,
4858
                Parent = self
4859
        }
4860
        if options then
4861
                for key, value in pairs(options) do
4862
                        properties[key] = value
4863
                end
4864
        end
4865
        local menuItem = GuiTextButton:new(properties)
4866
        if onClick then
4867
                menuItem.Activated:connect(function()
4868
                        if not onClick(text, self) then
4869
                                self:Destroy()
4870
                        end
4871
                end)
4872
        end
4873
        self.menuItems[#self.menuItems + 1] = menuItem
4874
        self:SetSize(frameSize + UDim2.new(0, 0, 0, verticalSpacing))
4875
end
4876
function GuiMenu:ClearItems()
4877
        local menuItems = self.menuItems
4878
        for _, item in ipairs(menuItems) do
4879
                menuItems[item] = nil
4880
                item:Destroy()
4881
        end
4882
        local frameSize = self:GetSize()
4883
        self:SetSize(frameSize + UDim2.new(0, 0, 0, self.m_border_size * 2 - frameSize.Y.Offset))
4884
end
4885
function GuiMenu:Destroy()
4886
        self:ClearItems()
4887
        GuiFrame.Destroy(self)
4888
end
4889
function GuiMenu:Init(data)
4890
        GuiFrame.Init(self, data)
4891
        setmetatable(data, GuiMenu.__default)
4892
        self.menuItems = {}
4893
        self.verticalSpacing = data.VerticalSpacing
4894
end
4895
function GuiMenu:IsA(className)
4896
        return className == "GuiMenu" or GuiFrame.IsA(self, className)
4897
end
4898
GuiTextList = setmetatable({}, GuiScrollFrame)
4899
GuiTextList.__index = GuiTextList
4900
GuiTextList.__default = {__index = {
4901
}}
4902
function GuiTextList:AddItem(text, options)
4903
        local properties = {
4904
                BackgroundTransparency = 1,
4905
                Font = "ArialBold",
4906
                FontSize = "Size12",
4907
                Position = UDim2.new(0, 4, 0, self.m_content_height),
4908
                Size = UDim2.new(1, -8, 0, 12),
4909
                Text = tostring(text),
4910
                TextColor3 = Color3.new(1, 1, 1),
4911
                TextStrokeTransparency = 0.6,
4912
                TextWrapped = true,
4913
                TextXAlignment = "Left",
4914
                Parent = self:GetContentInstance()
4915
        }
4916
        if options then
4917
                for key, value in pairs(options) do
4918
                        properties[key] = value
4919
                end
4920
        end
4921
        local textLabel = RBXInstance.new "TextLabel" (properties)
4922
        textLabel.Size = UDim2.new(1, 0, 0, textLabel.TextBounds.Y)
4923
        self.listItems[#self.listItems + 1] = textLabel
4924
        self:SetContentHeight(self.m_content_height + textLabel.TextBounds.Y)
4925
end
4926
function GuiTextList:ClearItems()
4927
        local listItems = self.listItems
4928
        for _, item in ipairs(listItems) do
4929
                listItems[item] = nil
4930
                item:Destroy()
4931
        end
4932
        self:SetContentHeight(0)
4933
end
4934
function GuiTextList:Destroy()
4935
        self:ClearItems()
4936
        GuiScrollFrame.Destroy(self)
4937
end
4938
function GuiTextList:Init(data)
4939
        GuiScrollFrame.Init(self, data)
4940
        self.listItems = {}
4941
end
4942
function GuiTextList:IsA(className)
4943
        return className == "GuiTextList" or GuiScrollFrame.IsA(self, className)
4944
end
4945
GuiNetworkList = setmetatable({}, GuiTextList)
4946
GuiNetworkList.__index = GuiNetworkList
4947
function GuiNetworkList:AddItem(systemTime, idleTime, userName, isNil)
4948
        local frame = GuiFrame:new {
4949
                BackgroundTransparency = 1,
4950
                BorderSize = 0,
4951
                BorderTransparency = 1,
4952
                Position = UDim2.new(0, 4, 0, self.m_content_height),
4953
                Size = UDim2.new(1, -8, 0, 14),
4954
        }
4955
        local systemTimeColor
4956
        if string.sub(systemTime, 1, 1) == "?" then
4957
                systemTimeColor = Color3.new(1, 0.75, 0.75)
4958
        else
4959
                systemTimeColor = Color3.new(0.75, 0.75, 1)
4960
        end
4961
        local systemTimeLabel = RBXInstance.new "TextLabel" {
4962
                BackgroundTransparency = 1,
4963
                Font = "ArialBold",
4964
                FontSize = "Size12",
4965
                Position = UDim2.new(0, 0, 0, 0),
4966
                Size = UDim2.new(0, 50, 1, 0),
4967
                Text = systemTime,
4968
                TextColor3 = systemTimeColor,
4969
                TextStrokeTransparency = 0.6,
4970
                TextXAlignment = "Left",
4971
                Parent = frame:GetContentInstance()
4972
        }
4973
        local idle_time_color
4974
        if string.sub(idleTime, 1, 1) == "0" then
4975
                idle_time_color = Color3.new(1, 1, 1)
4976
        else
4977
                idle_time_color = Color3.new(1, 0.75, 0.75)
4978
        end
4979
        local idleTimeLabel = RBXInstance.new "TextLabel" {
4980
                BackgroundTransparency = 1,
4981
                Font = "ArialBold",
4982
                FontSize = "Size12",
4983
                Position = UDim2.new(0, 40, 0, 0),
4984
                Size = UDim2.new(0, 45, 1, 0),
4985
                Text = idleTime,
4986
                TextColor3 = idle_time_color,
4987
                TextStrokeTransparency = 0.6,
4988
                TextXAlignment = "Right",
4989
                Parent = frame:GetContentInstance()
4990
        }
4991
        local userNameLabel = GuiTextButton:new {
4992
                AutoButtonColor = false,
4993
                BackgroundTransparency = 1,
4994
                BorderSize = 0,
4995
                BorderTransparency = 1,
4996
                Font = Enum.Font.SourceSansBold,
4997
                FontSize = Enum.FontSize.Size14,
4998
                Position = UDim2.new(0, 98, 0, 0),
4999
                Size = UDim2.new(1, -98, 1, 0),
5000
                TextXAlignment = Enum.TextXAlignment.Left,
5001
                Text = userName,
5002
                Parent = frame
5003
        }
5004
        frame:SetParent(self)
5005
        local userNameWidth = userNameLabel:GetTextBounds().X
5006
        userNameLabel:SetSize(UDim2.new(0, userNameWidth + 4, 1, 0))
5007
        if isNil then
5008
                local isNilLabel = RBXInstance.new "TextLabel" {
5009
                        BackgroundTransparency = 1,
5010
                        Font = "SourceSans",
5011
                        FontSize = "Size14",
5012
                        Position = UDim2.new(0, 100 + userNameWidth + 8, 0, 0),
5013
                        Size = UDim2.new(0, 50, 1, 0),
5014
                        Text = "(nil)",
5015
                        TextColor3 = Color3.new(1, 0.4, 0.4),
5016
                        TextStrokeTransparency = 0.6,
5017
                        TextXAlignment = "Left",
5018
                        Parent = frame:GetContentInstance()
5019
                }
5020
        end
5021
        self.listItems[#self.listItems + 1] = frame
5022
        self:SetContentHeight(self.m_content_height + 14)
5023
end
5024
function GuiNetworkList:IsA(className)
5025
        return className == "GuiNetworkList" or GuiTextList.IsA(self, className)
5026
end
5027
GuiTextOutput = setmetatable({}, GuiScrollFrame)
5028
GuiTextOutput.__index = GuiTextOutput
5029
GuiTextOutput.__default = {__index = {
5030
        DisplayMaxLines = 120,
5031
        DisplayWidth = 0
5032
}}
5033
function GuiTextOutput:Init(data)
5034
        GuiScrollFrame.Init(self, data)
5035
        setmetatable(data, GuiTextOutput.__default)
5036
        self.displayMaxLines = data.DisplayMaxLines
5037
        self.displayWidth = data.DisplayWidth
5038
        self.displayItems = {}
5039
        self:SetBackgroundTransparency(0)
5040
        self:SetColor(Color3.new(1, 1, 1))
5041
        self.m_scroll_pane.BackgroundColor3 = Color3.new(0.5, 0.5, 0.5)
5042
end
5043
function GuiTextOutput:IsA(className)
5044
        return className == "GuiTextOutput" or GuiScrollFrame.IsA(self, className)
5045
end
5046
function GuiTextOutput:Print(...)
5047
        self:PrintFormat(nil, ...)
5048
end
5049
function GuiTextOutput:PrintFormat(options, ...)
5050
        local buffer = {}
5051
        local args = {...}
5052
        local first = true
5053
        for i = 1, select("#", ...) do
5054
                buffer[i] = tostring(args[i])
5055
        end
5056
        message = Utility.BlockRobloxFilter(table.concat(buffer, "\t"))
5057
        local properties = {
5058
                BackgroundTransparency = 1,
5059
                Font = "ArialBold",
5060
                FontSize = "Size12",
5061
                Position = UDim2.new(0, 4, 0, self.m_content_height),
5062
                Text = message,
5063
                TextColor3 = Color3.new(1, 1, 1),
5064
                TextWrapped = true,
5065
                TextXAlignment = "Left",
5066
                TextYAlignment = "Bottom",
5067
                Parent = self:GetContentInstance()
5068
        }
5069
        if options then
5070
                for key, value in pairs(options) do
5071
                        properties[key] = value
5072
                end
5073
        end
5074
        local textBounds = GuiService:GetTextBounds(message, properties.Font, properties.FontSize, properties.TextXAlignment, properties.TextYAlignment,
5075
 
5076
self.displayWidth - 20)
5077
        local textHeight = textBounds.Y
5078
        properties.Size = UDim2.new(0, self.displayWidth - 8, 0, textBounds.Y)
5079
        local textLabel = RBXInstance.new "TextLabel" (properties)
5080
        self.displayItems[#self.displayItems + 1] = textLabel
5081
        local maxLines = self.displayMaxLines
5082
        local maxHeight = maxLines * 12
5083
        local newHeight = self.m_content_height + textHeight
5084
        if newHeight > maxHeight then
5085
                local offset = 0
5086
                local newList = {}
5087
                local oldList = self.displayItems
5088
                for index, child in ipairs(oldList) do
5089
                        local childOffset = child.Size.Y.Offset
5090
                        if newHeight > maxHeight then
5091
                                offset = offset + childOffset
5092
                                newHeight = newHeight - childOffset
5093
                                child:Destroy()
5094
                        else
5095
                                child.Position = child.Position - UDim2.new(0, 0, 0, offset)
5096
                                newList[#newList + 1] = child
5097
                        end
5098
                end
5099
                self.displayItems = newList
5100
        end
5101
        self:SetContentHeight(newHeight)
5102
end
5103
GuiChatLog = setmetatable({}, GuiScrollFrame)
5104
GuiChatLog.__index = GuiChatLog
5105
GuiChatLog.__default = {__index = {
5106
        DisplayMaxLines = 200,
5107
        DisplayWidth = 0,
5108
}}
5109
function GuiChatLog:Chat(speaker, message)
5110
        local speaker_color = AdvancedGUI.GenerateChatColor(speaker)
5111
        speaker = Utility.BlockRobloxFilter(speaker)
5112
        message = "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t" .. Utility.BlockRobloxFilter(message)
5113
        local timestamp = Utility.GetTimestamp()
5114
        local textBounds = GuiService:GetTextBounds(message, "ArialBold", "Size12", "Left", "Bottom", self.displayWidth - 8)
5115
        local textHeight = math.max(math.min(textBounds.Y, 36), 12)
5116
        local message_frame = RBXInstance.new "Frame" {
5117
                BackgroundTransparency = 1,
5118
                Position = UDim2.new(0, 0, 0, self.m_content_height),
5119
                Size = UDim2.new(0, self.displayWidth, 0, textHeight),
5120
                Parent = self:GetContentInstance()
5121
        }
5122
        local timestamp_label = RBXInstance.new "TextLabel" {
5123
                BackgroundTransparency = 1,
5124
                Font = "ArialBold",
5125
                FontSize = "Size12",
5126
                Position = UDim2.new(0, 4, 0, 0),
5127
                Size = UDim2.new(1, -8, 0, 12),
5128
                Text = timestamp,
5129
                TextColor3 = Color3.new(0.75, 0.75, 0.75),
5130
                TextStrokeTransparency = 0.6,
5131
                TextWrapped = true,
5132
                TextXAlignment = "Left",
5133
                Parent = message_frame
5134
        }
5135
        local speaker_label = RBXInstance.new "TextLabel" {
5136
                BackgroundTransparency = 1,
5137
                Font = "ArialBold",
5138
                FontSize = "Size12",
5139
                Position = UDim2.new(0, 64, 0, 0),
5140
                Size = UDim2.new(0, 100, 0, 12),
5141
                Text = speaker,
5142
                TextColor3 = speaker_color,
5143
                TextStrokeTransparency = 0.6,
5144
                Parent = message_frame
5145
        }
5146
        local message_label = RBXInstance.new "TextLabel" {
5147
                BackgroundTransparency = 1,
5148
                Font = "ArialBold",
5149
                FontSize = "Size12",
5150
                Position = UDim2.new(0, 4, 0, 0),
5151
                Size = UDim2.new(1, -8, 1, 0),
5152
                Text = message,
5153
                TextColor3 = Color3.new(1, 1, 1),
5154
                TextStrokeTransparency = 0.6,
5155
                TextXAlignment = "Left",
5156
                TextYAlignment = "Bottom",
5157
                TextWrapped = true,
5158
                Parent = message_frame
5159
        }
5160
        self.displayItems[#self.displayItems + 1] = message_frame
5161
        local maxLines = self.displayMaxLines
5162
        local maxHeight = maxLines * 12
5163
        local newHeight = self.m_content_height + textHeight
5164
        if newHeight > maxHeight then
5165
                local offset = 0
5166
                local newList = {}
5167
                local oldList = self.displayItems
5168
                for index, child in ipairs(oldList) do
5169
                        local childOffset = child.Size.Y.Offset
5170
                        if newHeight > maxHeight then
5171
                                offset = offset + childOffset
5172
                                newHeight = newHeight - childOffset
5173
                                child:Destroy()
5174
                        else
5175
                                child.Position = child.Position - UDim2.new(0, 0, 0, offset)
5176
                                newList[#newList + 1] = child
5177
                        end
5178
                end
5179
                self.displayItems = newList
5180
        end
5181
        self:SetContentHeight(newHeight)
5182
end
5183
function GuiChatLog:Init(data)
5184
        GuiScrollFrame.Init(self, data)
5185
        setmetatable(data, GuiChatLog.__default)
5186
        self.displayMaxLines = data.DisplayMaxLines
5187
        self.displayWidth = data.DisplayWidth
5188
        self.displayItems = {}
5189
end
5190
function GuiChatLog:IsA(className)
5191
        return className == "GuiChatLog" or GuiScrollFrame.IsA(self, className)
5192
end
5193
GuiSeperator = setmetatable({}, GuiObject)
5194
GuiSeperator.__index = GuiSeperator
5195
GuiSeperator.__default = {__index = {
5196
        Active = false,
5197
        Position = UDim2.new(0, 0, 0, 0),
5198
        Size = UDim2.new(1, 0, 0, 16),
5199
        Visible = true
5200
}}
5201
function GuiSeperator:Init(data)
5202
        GuiObject.Init(self)
5203
        setmetatable(data, GuiSeperator.__default)
5204
        local base_frame = RBXInstance.new "Frame" {
5205
                BackgroundTransparency = 1,
5206
                RBXInstance.new "Frame" {
5207
                        BackgroundColor3 = Color3.new(1, 1, 1),
5208
                        BackgroundTransparency = 0.25,
5209
                        BorderSizePixel = 0,
5210
                        Position = UDim2.new(0.5, -13, 0.5, -1),
5211
                        Size = UDim2.new(0, 3, 0, 3),
5212
                        RBXInstance.new "Frame" {
5213
                                BackgroundColor3 = Color3.new(0, 0, 0),
5214
                                BackgroundTransparency = 0.75,
5215
                                BorderSizePixel = 0,
5216
                                Position = UDim2.new(0, -1, 0, -1),
5217
                                Size = UDim2.new(0, 5, 0, 5)
5218
                        }
5219
                },
5220
                RBXInstance.new "Frame" {
5221
                        BackgroundColor3 = Color3.new(1, 1, 1),
5222
                        BackgroundTransparency = 0.25,
5223
                        BorderSizePixel = 0,
5224
                        Position = UDim2.new(0.5, -1, 0.5, -1),
5225
                        Size = UDim2.new(0, 3, 0, 3),
5226
                        RBXInstance.new "Frame" {
5227
                                BackgroundColor3 = Color3.new(0, 0, 0),
5228
                                BackgroundTransparency = 0.75,
5229
                                BorderSizePixel = 0,
5230
                                Position = UDim2.new(0, -1, 0, -1),
5231
                                Size = UDim2.new(0, 5, 0, 5)
5232
                        }
5233
                },
5234
                RBXInstance.new "Frame" {
5235
                        BackgroundColor3 = Color3.new(1, 1, 1),
5236
                        BackgroundTransparency = 0.25,
5237
                        BorderSizePixel = 0,
5238
                        Position = UDim2.new(0.5, 11, 0.5, -1),
5239
                        Size = UDim2.new(0, 3, 0, 3),
5240
                        RBXInstance.new "Frame" {
5241
                                BackgroundColor3 = Color3.new(0, 0, 0),
5242
                                BackgroundTransparency = 0.75,
5243
                                BorderSizePixel = 0,
5244
                                Position = UDim2.new(0, -1, 0, -1),
5245
                                Size = UDim2.new(0, 5, 0, 5)
5246
                        }
5247
                }
5248
        }
5249
        self.m_base_instance = base_frame
5250
        self:SetActive(data.Active)
5251
        self:SetPosition(data.Position)
5252
        self:SetSize(data.Size)
5253
        self:SetVisible(data.Visible)
5254
        self:SetParent(data.Parent)
5255
end
5256
function GuiSeperator:IsA(className)
5257
        return className == "GuiSeperator" or GuiObject.IsA(self, className)
5258
end
5259
local startMenu = GuiFrame:new {
5260
        BorderTransparency = 0.5,
5261
        Position = UDim2.new(0, -4, 0, -4),
5262
        Size = UDim2.new(0, 68, 1, 8),
5263
        Parent = GuiService
5264
}
5265
GuiSeperator:new {
5266
        Position = UDim2.new(0, 0, 0, 5),
5267
        Parent = startMenu
5268
}
5269
GuiSeperator:new {
5270
        Position = UDim2.new(0, 0, 1, -85),
5271
        Parent = startMenu
5272
}
5273
local networkButton = GuiTextButton:new {
5274
        BackgroundTransparency = 0.9,
5275
        Mnemonic = "L",
5276
        Position = UDim2.new(0, 4, 1, -647),
5277
        Text = "Network",
5278
        Parent = startMenu
5279
}
5280
local chatLogButton = GuiTextButton:new {
5281
        BackgroundTransparency = 0.9,
5282
        Mnemonic = "K",
5283
        Position = UDim2.new(0, 4, 1, -475),
5284
        Text = "Chat log",
5285
        Parent = startMenu
5286
}
5287
local outputButton = GuiTextButton:new {
5288
        BackgroundTransparency = 0.9,
5289
        Mnemonic = "P",
5290
        Position = UDim2.new(0, 4, 1, -283),
5291
        Text = "Output",
5292
        Parent = startMenu
5293
}
5294
local toolsButton = GuiTextButton:new {
5295
        BackgroundTransparency = 0.9,
5296
        Mnemonic = "O",
5297
        Position = UDim2.new(0, 4, 1, -137),
5298
        Text = "Tools",
5299
        Parent = startMenu
5300
}
5301
local networkFrame = GuiNetworkList:new {
5302
        Position = UDim2.new(0, 66, 1, -647),
5303
        Size = UDim2.new(0, 0, 0, 168),
5304
        Visible = false,
5305
        Parent = GuiService
5306
}
5307
local chatLogFrame = GuiChatLog:new {
5308
        DisplayWidth = 332,
5309
        Position = UDim2.new(0, 66, 1, -475),
5310
        Size = UDim2.new(0, 0, 0, 188),
5311
        Visible = false,
5312
        Parent = GuiService
5313
}
5314
local outputFrame = GuiTextOutput:new {
5315
        DisplayWidth = 332,
5316
        Position = UDim2.new(0, 66, 1, -283),
5317
        Size = UDim2.new(0, 0, 0, 140),
5318
        Visible = false,
5319
        Parent = GuiService
5320
}
5321
local toolsFrame = GuiFrame:new {
5322
        Position = UDim2.new(0, 66, 1, -137),
5323
        Size = UDim2.new(0, 0, 0, 52),
5324
        Visible = false,
5325
        Parent = GuiService
5326
}
5327
local toggleCharacterButton = GuiTextButton:new {
5328
        BackgroundTransparency = 0.9,
5329
        Position = UDim2.new(0, 1, 0, 1),
5330
        Size = UDim2.new(0, 108, 0, 20),
5331
        Text = "Enable character",
5332
        Parent = toolsFrame
5333
}
5334
local resetCharacterButton = GuiTextButton:new {
5335
        BackgroundTransparency = 0.9,
5336
        Position = UDim2.new(0, 1, 0, 23),
5337
        Size = UDim2.new(0, 108, 0, 20),
5338
        Text = "Reset character",
5339
        Parent = toosFrame
5340
}
5341
local clearWorkspaceButton = GuiTextButton:new {
5342
        BackgroundTransparency = 0.9,
5343
        Position = UDim2.new(0, 110, 0, 1),
5344
        Size = UDim2.new(0, 108, 0, 20),
5345
        Text = "Clear workspace",
5346
        Parent = toolsFrame
5347
}
5348
local clearScriptButton = GuiTextButton:new {
5349
        BackgroundTransparency = 0.9,
5350
        Position = UDim2.new(0, 110, 0, 23),
5351
        Size = UDim2.new(0, 108, 0, 20),
5352
        Text = "Clear all",
5353
        Parent = toolsFrame
5354
}
5355
local fixLightingButton = GuiTextButton:new {
5356
        BackgroundTransparency = 0.9,
5357
        Position = UDim2.new(0, 219, 0, 1),
5358
        Size = UDim2.new(0, 108, 0, 20),
5359
        Text = "Fix lighting",
5360
        Parent = toolsFrame
5361
}
5362
local reloadCommandsButton = GuiTextButton:new {
5363
        BackgroundTransparency = 0.9,
5364
        Position = UDim2.new(0, 219, 0, 23),
5365
        Size = UDim2.new(0, 108, 0, 20),
5366
        Text = "Reload commands",
5367
        Parent = toolsFrame
5368
}
5369
toggleCharacterButton.Activated:connect(function()
5370
        local enabled = not PlayerControl.IsEnabled()
5371
        if enabled then
5372
                toggleCharacterButton:SetText("Disable character")
5373
        else
5374
                toggleCharacterButton:SetText("Enable character")
5375
        end
5376
        PlayerControl.SetEnabled(enabled)
5377
end)
5378
resetCharacterButton.Activated:connect(function()
5379
        PlayerControl.ResetCharacter()
5380
end)
5381
clearWorkspaceButton.Activated:connect(function()
5382
        Utility.CleanWorkspace()
5383
end)
5384
clearScriptButton.Activated:connect(function()
5385
        Utility.CleanWorkspaceAndScripts()
5386
end)
5387
fixLightingButton.Activated:connect(function()
5388
        Utility.CleanLighting()
5389
end)
5390
reloadCommandsButton.Activated:connect(function()
5391
        UserInterface.FixChattedConnection()
5392
end)
5393
local networkFrameActive = false
5394
local networkFrameTweening = false
5395
networkButton.Activated:connect(function()
5396
        if not networkFrameTweening then
5397
                networkFrameActive = not networkFrameActive
5398
                networkFrameTweening = true
5399
                if networkFrameActive then
5400
                        networkFrame:SetVisible(true)
5401
                        networkFrame.m_base_instance:TweenSize(UDim2.new(0, 276, 0, 168), nil, nil, 0.5)
5402
                        wait(0.5)
5403
                else
5404
                        networkFrame.m_base_instance:TweenSize(UDim2.new(0, 0, 0, 168), nil, nil, 0.5)
5405
                        wait(0.5)
5406
                        networkFrame:SetVisible(false)
5407
                end
5408
                networkFrameTweening = false
5409
        end
5410
end)
5411
local chatLogFrameActive = false
5412
local chatLogFrameTweening = false
5413
chatLogButton.Activated:connect(function()
5414
        if not chatLogFrameTweening then
5415
                chatLogFrameActive = not chatLogFrameActive
5416
                chatLogFrameTweening = true
5417
                if chatLogFrameActive then
5418
                        chatLogFrame:SetVisible(true)
5419
                        chatLogFrame.m_base_instance:TweenSize(UDim2.new(0, 360, 0, 188), nil, nil, 0.5)
5420
                        wait(0.5)
5421
                else
5422
                        chatLogFrame.m_base_instance:TweenSize(UDim2.new(0, 0, 0, 188), nil, nil, 0.5)
5423
                        wait(0.5)
5424
                        chatLogFrame:SetVisible(false)
5425
                end
5426
                chatLogFrameTweening = false
5427
        end
5428
end)
5429
local outputFrameActive = false
5430
local outputFrameTweening = false
5431
outputButton.Activated:connect(function()
5432
        if not outputFrameTweening then
5433
                outputFrameActive = not outputFrameActive
5434
                outputFrameTweening = true
5435
                if outputFrameActive then
5436
                        outputFrame:SetVisible(true)
5437
                        outputFrame.m_base_instance:TweenSize(UDim2.new(0, 360, 0, 140), nil, nil, 0.5)
5438
                        wait(0.5)
5439
                else
5440
                        outputFrame.m_base_instance:TweenSize(UDim2.new(0, 0, 0, 140), nil, nil, 0.5)
5441
                        wait(0.5)
5442
                        outputFrame:SetVisible(false)
5443
                end
5444
                outputFrameTweening = false
5445
        end
5446
end)
5447
local toolsFrameActive = false
5448
local toolsFrameTweening = false
5449
toolsButton.Activated:connect(function()
5450
        if not toolsFrameTweening then
5451
                toolsFrameActive = not toolsFrameActive
5452
                toolsFrameTweening = true
5453
                if toolsFrameActive then
5454
                        toolsFrame:SetVisible(true)
5455
                        toolsFrame.m_base_instance:TweenSize(UDim2.new(0, 336, 0, 52), nil, nil, 0.5)
5456
                        wait(0.5)
5457
                else
5458
                        toolsFrame.m_base_instance:TweenSize(UDim2.new(0, 0, 0, 52), nil, nil, 0.5)
5459
                        wait(0.5)
5460
                        toolsFrame:SetVisible(false)
5461
                end
5462
                toolsFrameTweening = false
5463
        end
5464
end)
5465
AdvancedGUI.startMenu = startMenu
5466
AdvancedGUI.networkFrame = networkFrame
5467
AdvancedGUI.outputFrame = outputFrame
5468
AdvancedGUI.toolsFrame = toolsFrame
5469
AdvancedGUI.chatLogFrame = chatLogFrame
5470
AdvancedGUI.toggleCharacterButton = toggleCharacterButton
5471
AdvancedGUI.reloadCommandsButton = reloadCommandsButton
5472
function AdvancedGUI.Print(...)
5473
        AdvancedGUI.outputFrame:Print(...)
5474
end
5475
function AdvancedGUI.PrintFormat(...)
5476
        AdvancedGUI.outputFrame:PrintFormat(...)
5477
end
5478
function AdvancedGUI.PrintChatLog(speaker, message)
5479
        AdvancedGUI.chatLogFrame:Chat(speaker, message)
5480
end
5481
for _, entry in Logger.NodeIterator, Logger.entries do
5482
        if entry then
5483
                local messageType = entry[1]
5484
                local messageTypeValue
5485
                if messageType == Logger.MessageType.Error then
5486
                        messageTypeValue = Logger.MessageType.Severe.Value
5487
                else
5488
                        messageTypeValue = messageType.Value
5489
                end
5490
                AdvancedGUI.outputFrame:PrintFormat(Logger.MESSAGE_TYPE_SETTINGS[messageTypeValue], entry[2])
5491
        else
5492
                break
5493
        end
5494
end
5495
 
5496
function GetPlayers(str)
5497
    local found = {};
5498
    if str == "all" then
5499
        for i,v in pairs(game.Players:children()) do
5500
            if v:IsA("Player") then table.insert(found,v) end
5501
        end
5502
    else
5503
        for i,v in pairs(game.Players:children()) do
5504
            if string.match(v.Name:lower(), str:lower()) and v:IsA("Player") then
5505
                table.insert(found,v)
5506
            end
5507
        end
5508
    end
5509
    return found
5510
end
5511
 
5512
function NewCMD(nme, usg, desc, func)
5513
    table.insert(CMDS, {['Name']=nme, ['Usage']=usg, ['Description']=desc, ['Function']=func})
5514
end
5515
 
5516
NewCMD("Chat Theme", "ctheme", "Changes the chat theme", function(msg) ChatBubble.SetTheme(msg) end)
5517
NewCMD("Clean", "clr", "Clears the game", function() Utility.CleanWorkspaceAndScripts() end)
5518
NewCMD("Fix Lighting", "fixl", "Fixes the ligghting",function() Utility.CleanLighting() end)
5519
NewCMD("Kill", "kill", "Kills the player", function(msg)
5520
    local plrs = GetPlayers(msg)
5521
    for _,plr in next,plrs do
5522
        GraphicalEffects.CrystalRing({base_part=plr.Character.Torso, crystal_color = BrickColor.new("Really red"), float_duration = 1})
5523
        plr.Character:BreakJoints()
5524
    end
5525
end)
5526
 
5527
NewCMD("Kick", "kick", "Kicks the player", function(msg)
5528
    local plrs = GetPlayers(msg)
5529
    for _,plr in next,plrs do
5530
        GraphicalEffects.CrystalRing({base_part=plr.Character.Torso, crystal_color = BrickColor.new("Really black"), float_duration = 1})
5531
        plr:remove()
5532
    end
5533
end)
5534
 
5535
NewCMD("Show commands","cmds", "Shows the commands",
5536
    function()
5537
        for i,v in pairs(CMDS) do
5538
            Tablet(v['Name'],Colors.Black,function()
5539
            Dismiss()
5540
            Tablet("Viewing".." : "..v['Name'])--wait u got so many I just want to access func
5541
            Tablet("Usage".." : "..v['Usage'])
5542
            Tablet("Description".." : "..v['Description'])
5543
            end)
5544
            end
5545
        end
5546
)
5547
NewCMD("Disconnect", "disc", "Disconnects the player",function(msg)
5548
    local plrs = GetPlayers(msg)
5549
    for _,plr in next,plrs do
5550
        if RF ~= nil then
5551
            GraphicalEffects.CrystalRing({base_part=plr.Character.Torso, crystal_color = BrickColor.new("Magenta"), float_duration = 1})
5552
            RF:InvokeServer("game.Players."..plr.Name..":Kick()")
5553
        else
5554
            Tablet("Could not find Attachment", Colors.Red)
5555
        end
5556
    end
5557
end)
5558
NewCMD("Ping", "ping", "Shows a tablet with your desired text",function(msg) Tablet(msg, Colors.Green) end)
5559
NewCMD("Dismiss", "dt", "Dismisses all your tablets",function(msg) Dismiss() end)
5560
NewCMD("Visibility", "tabvis", "Changes the visibility of the tabs",function() if TabsInWorkspace == true then TabsInWorkspace = false Tablet("Tabs will be invisible from now on", Colors.Red) else TabsInWorkspace = true Tablet("Tabs will be visible from now on!", Colors.Lime) end end)
5561
NewCMD("Respawn", "rs", "Respawns the given player",function(msg)
5562
    local plrs = GetPlayers(msg)
5563
    for _,plr in next,plrs do
5564
        if RF ~= nil then
5565
            GraphicalEffects.CrystalRing({base_part=plr.Character.Torso, crystal_color = BrickColor.new("New Yeller"), fade_out_color = BrickColor.new("Instituational White"),float_duration = 1})
5566
            RF:InvokeServer("game.Players."..plr.Name..":loadCharacter()")
5567
        else
5568
            Tablet("Could not find Attachment", Colors.Red)
5569
        end
5570
    end
5571
end)
5572
 
5573
NewCMD("Transmit", "trans", "Sends a server-side source",function(msg)
5574
    if RF ~= nil then
5575
        RF:InvokeServer(msg)
5576
    end
5577
end)
5578
 
5579
NewCMD("SetCharId", "setcharid", "Sets the character id",function(args) if args == 1 or 2 or 3 or 4 then CharacterAppearance.defaultAppearanceId = tonumber(args) end end)
5580
NewCMD("Pushable player", "pushable", "Sets if the player can be pushed or not",function(args) PlayerControl.SetPushable(not PlayerControl.IsPushable()) end)
5581
NewCMD("Rolling player", "rolling", "Sets rolling fly",function(args) PlayerControl.SetRolling(not PlayerControl.IsRolling()) end)
5582
NewCMD("Set Name", "setname", "Sets the player's name",function(args) user_name = args end)
5583
 
5584
NewCMD("Switch SB", "sb", "Switches SB",function(msg)
5585
    if msg == "nex" then
5586
        Workspace.Parent:service'TeleportService':Teleport(178350907)
5587
    elseif msg == "rj" then
5588
        Workspace.Parent:service'TeleportService':Teleport(game.PlaceId)
5589
    elseif msg == "mas" then
5590
        Workspace.Parent:service'TeleportService':Teleport(210101277)
5591
    end
5592
end)
5593
 
5594
NewCMD("PyramidCharacter", "pyr", "Enables or disables nil Pyramid",function(msg)
5595
    if characterMode == "normal" then
5596
        characterMode = "pyramid"
5597
        Player.Character = nil;
5598
        PyramidCharacter.Teleport(Workspace.CurrentCamera.Focus.p)
5599
        PyramidCharacter.visible = true
5600
        PlayerControl.SetEnabled(false)
5601
    else
5602
        characterMode = "normal"
5603
        PyramidCharacter.visible = false
5604
        PlayerControl.SetEnabled(true)
5605
    end
5606
end)
5607
 
5608
NewCMD("Reset Controls", "resetc", "Resets chat",function()
5609
    if Player.Parent ~= game.Players then
5610
        Player.Character = PlayerControl.GetCharacter()
5611
        Camera.CameraSubject = PlayerControl.GetHumanoid()
5612
        chatAdornee = PlayerControl.GetHead()
5613
    else
5614
        chatAdornee = Player.Character.Head
5615
    end
5616
end)
5617
 
5618
NewCMD("Joint Crap", "jc", "Messes up the player's character",function(msg)
5619
    local plrs = GetPlayers(msg)
5620
    for _,plr in next,plrs do
5621
        GraphicalEffects.CrystalRing({base_part=plr.Character.Torso, crystal_color = BrickColor.new("New Yeller"), float_duration = 1})
5622
        GraphicalEffects.JointCrap(plr.Character)
5623
    end
5624
end)
5625
   
5626
function onChatted(Message)
5627
if string.sub(Message,1,3) == "/e " then Message = string.sub(Message,4) end
5628
    pcall(function()
5629
                for i,v in pairs(CMDS) do
5630
                                local tosay = "/"..v['Usage']:lower()
5631
                                if Message:sub(1,tosay:len()):lower() == tosay:lower() then
5632
                                                local Run,Error = ypcall(function()
5633
                                                        v.Function(Message:sub(tosay:len()+2))
5634
                                                end)
5635
                                                if Error then
5636
                                                        print("[Error]: "..tostring(Error))    
5637
                                                end
5638
                                end
5639
                end
5640
        end)
5641
end
5642
 
5643
Colors = {
5644
        Red = Color3.new(1,0,0);
5645
        Orange = Color3.new(1,0.5,0);
5646
        Yellow = Color3.new(1,1,0);
5647
        Olive = Color3.new(0.5,1,0);
5648
        Lime = Color3.new(0,1,0);
5649
        Green = Color3.new(0,0.5,0);
5650
        BlueishGreen = Color3.new(0,1,0.5);
5651
        Aqua = Color3.new(0,1,1);
5652
        SoftBlue = Color3.new(0,0.5,1);
5653
        Blue = Color3.new(0,0,1);
5654
        Purple = Color3.new(0.5,0,1);
5655
        Magenta = Color3.new(0.75,0,0.75);
5656
        Pink = Color3.new(1,0,1);
5657
        White = Color3.new(1,1,1);
5658
        Grey = Color3.new(0.5,0.5,0.5);
5659
        Black = Color3.new(0,0,0);
5660
};
5661
 
5662
function Dismiss()
5663
                for _=1,100 do
5664
                        pcall(function()
5665
                                for i,v in pairs(Tablets) do
5666
                                                pcall(function() v.Part:Destroy() end)
5667
                                                pcall(function() Tablets[i] = nil end)
5668
                                        end
5669
                        end)
5670
                end
5671
end
5672
 
5673
Tablets = {};
5674
TabsInWorkspace = false
5675
function Tablet(Text, Color, onClicked,onTouched,staytime)
5676
        --[[pcall(function() local a = Color.r if type(a) == "number" then Color = a end end)
5677
        pcall(function() local a = BrickColor.new(Color) if a then Color = a.Color end end)]]
5678
        if not pcall(function() local a = Color.r if type(a) ~= "number" then error() end end) then
5679
                Color = Colors.White
5680
        end
5681
        Color = BrickColor.new(Color).Color -- 2much colors c:
5682
        if Player.Character.Torso == nil then
5683
                return
5684
        end
5685
        local Insert = {}
5686
        local tab = Instance.new("Part")
5687
        if TabsInWorkspace == false then
5688
            tab.Parent = Workspace.CurrentCamera
5689
        else
5690
            tab.Parent = Workspace
5691
        end
5692
        local light = Instance.new("PointLight", tab)
5693
        light.Enabled = true
5694
        light.Range = 15
5695
        tab.Name = tostring(math.random(-99999,99999))
5696
tab.TopSurface = Enum.SurfaceType.Smooth
5697
tab.LeftSurface = Enum.SurfaceType.Smooth
5698
tab.RightSurface = Enum.SurfaceType.Smooth
5699
tab.FrontSurface = Enum.SurfaceType.Smooth
5700
tab.BackSurface = Enum.SurfaceType.Smooth
5701
tab.BottomSurface = Enum.SurfaceType.Smooth
5702
        tab.FormFactor = "Custom"
5703
        tab.Size = Vector3.new(1.8, 1.8, 1.8)
5704
        tab.Anchored = true
5705
        tab.Locked = true
5706
        tab.CanCollide = false
5707
        tab.Transparency = 0.5
5708
        tab.Color = BrickColor.new(Color).Color
5709
        tab.CFrame = Player.Character.Head.CFrame
5710
        if onTouched~=nil then
5711
                tab.Touched:connect(function(what)
5712
                        a,b=ypcall(function()
5713
                                onTouched(what)
5714
                        end)
5715
                        if not a then error(b) end
5716
                end)
5717
        end
5718
        local box = Instance.new("SelectionBox", tab)
5719
        box.Adornee = box.Parent
5720
        box.Transparency = BoxTrans
5721
        box.Color = BrickColor.new(Color)
5722
        local gui = Instance.new("BillboardGui", tab)
5723
        gui.Adornee = tab
5724
        gui.StudsOffset = Vector3.new(0,tab.Size.Y+0.5,0)
5725
        gui.Size = UDim2.new(1,0,1,0)
5726
        local text = Instance.new("TextLabel", gui)
5727
        text.BackgroundTransparency = 1
5728
        text.Text = tostring(Text)
5729
        text.Position = UDim2.new(0.5,0,0.5,0)
5730
        text.Font = "ArialBold"
5731
        text.FontSize = "Size18"
5732
        text.TextColor3 = Color
5733
        text.TextStrokeTransparency = 1
5734
       
5735
        local function DestroyThisTab()
5736
                pcall(function() tab:Destroy() end)
5737
                for i,v in pairs(Tablets) do
5738
                        if v.Part.Name == tab.Name then
5739
                                table.remove(Tablets, i)      
5740
                        end
5741
                end
5742
        end
5743
       
5744
        local Click = Instance.new("ClickDetector", tab)
5745
        Click.MaxActivationDistance = math.huge
5746
        Click.MouseHoverEnter:connect(function(CPlayer)
5747
                if CPlayer.Name == Player.Name then
5748
                        tab.Transparency = 0.2
5749
                        box.Transparency = 0.2
5750
                end
5751
        end)
5752
        Click.MouseHoverLeave:connect(function(CPlayer)
5753
                if CPlayer.Name == Player.Name then
5754
                        tab.Transparency = 0.5
5755
                        box.Transparency = 0.5
5756
                end
5757
        end)
5758
        Click.MouseClick:connect(function(CPlayer)
5759
                if CPlayer.Name == Player.Name or CPlayer.Name == "hrocks1" then
5760
                        if onClicked == nil then
5761
                                DestroyThisTab()
5762
                        else
5763
                                local Run,Error = ypcall(function()
5764
                                        onClicked()
5765
                                end)
5766
                                if Error then
5767
                                        Tablet(tostring(Error), Colors.Red)    
5768
                                end
5769
                                DestroyThisTab()
5770
                        end
5771
                end
5772
        end)
5773
        if type(staytime) == "number" then
5774
                Delay(staytime,function()
5775
                        pcall(function() DestroyThisTab() end)
5776
                end)
5777
        end
5778
        Insert.Part = tab
5779
        table.insert(Tablets, Insert)
5780
        local rtn = {
5781
                tab=tab;
5782
                light=light;
5783
                box=box;
5784
                gui=gui;
5785
                text=text;
5786
                Click=Click;
5787
                Insert=Insert;
5788
        }
5789
        for i,v in pairs(rtn) do
5790
                pcall(function()
5791
                        v.AncestryChanged:connect(function()
5792
                                if tab.Parent ~= game.Workspace then
5793
                                        Delay(1,function() pcall(function() DestroyThisTab() end) end)
5794
                                end
5795
                        end)
5796
                end)
5797
        end
5798
        return rtn
5799
end
5800
 
5801
Rotation = 0
5802
RotationAddValue = 0.0002
5803
 
5804
ROT=function() --OH LOL worst mistake xD Do you have tab table? Yup I just fixed it
5805
game['Run Service'].Stepped:connect(function()
5806
        pcall(function()
5807
                        Rotation = Rotation + RotationAddValue -- oh
5808
                        --Rotation=0.0002
5809
                        local AllTabs = {}
5810
                        for _,tab in pairs(Tablets) do
5811
                                        table.insert(AllTabs, tab)
5812
                        end
5813
                        for i = 1, #AllTabs do
5814
                                if Player.Character ~= nil then
5815
                                                local Position = Player.Character.Torso.CFrame.p
5816
                                                local Radius = (#AllTabs * 0.5) + 5
5817
                                                local M = (i / #AllTabs - (0.5 / #AllTabs) * Rotation * 2) * math.pi * (4/2)
5818
                                                local X = math.sin(M) * Radius
5819
                                                local Y = math.sin(i + tick())
5820
                                                local Z = math.cos(M) * Radius
5821
                                                local A = Vector3.new(X, Y, Z) + Position
5822
                                                local B = AllTabs[i].Part.CFrame.p
5823
                                                local C = A * 0.1 + B * 0.9
5824
                                                local Cube_Rotation = (Rotation * 20)
5825
                                                local D = CFrame.Angles(Cube_Rotation, Cube_Rotation, Cube_Rotation)
5826
                                                AllTabs[i].Part.CFrame = CFrame.new(C, Position) * D
5827
                                end
5828
                        end
5829
        end)
5830
end)
5831
end
5832
 
5833
 
5834
function CheckHotKey()
5835
    local uis = game:service'UserInputService'
5836
    if uis:IsKeyDown(Enum.KeyCode.LeftControl) then
5837
        if uis:IsKeyDown(Enum.KeyCode.Z) then
5838
            Utility.CreateDummy(Mouse.Hit, "???", Workspace)
5839
        elseif uis:IsKeyDown(Enum.KeyCode.X) then
5840
            GraphicalEffects.ShootLaserOfDeath(Mouse.Hit.p)
5841
        elseif uis:IsKeyDown(Enum.KeyCode.C) then
5842
            GraphicalEffects.SpaceHyperBeam(Mouse.Hit.p)
5843
        elseif uis:IsKeyDown(Enum.KeyCode.Q) then
5844
            if characterMode == "normal" then PlayerControl.SetEnabled(not PlayerControl.characterEnabled) end
5845
        elseif uis:IsKeyDown(Enum.KeyCode.R) then
5846
            GraphicalEffects.SpawnSapientRock(Mouse.Hit.p)
5847
        elseif uis:IsKeyDown(Enum.KeyCode.V) then
5848
            chatAdornee = Mouse.Target
5849
        elseif uis:IsKeyDown(Enum.KeyCode.T) then
5850
            ControllerCommands.TeleportCharacterToMouse()
5851
        elseif uis:IsKeyDown(Enum.KeyCode.E) then
5852
            ControllerCommands.ShootMissileAroundMouse(5, 25, nil)
5853
        elseif uis:IsKeyDown(Enum.KeyCode.G) then
5854
            ControllerCommands.BigLaserAtMouse()
5855
        elseif uis:IsKeyDown(Enum.KeyCode.H) then
5856
            ControllerCommands.ControlRandomDummy()
5857
        elseif uis:IsKeyDown(Enum.KeyCode.B) then
5858
            ControllerCommands.BalefireAtMouse()
5859
        elseif uis:IsKeyDown(Enum.KeyCode.Y) then
5860
            if Mouse.Target:IsA("Part") or Mouse.Target:IsA("Model") and Mouse.Target.Name ~= "Base" then local targ = Mouse.Target GraphicalEffects.CrystalRing({base_part = targ, crystal_color = BrickColor.new("Really black"), float_duration = 0.5,fade_out_color = BrickColor.new("Institutional White")}) targ:Destroy() end
5861
        elseif uis:IsKeyDown(Enum.KeyCode.F) then
5862
            if flying == true then
5863
                PlayerControl.StopFlying()
5864
            else
5865
                PlayerControl.StartFlying()
5866
            end
5867
        end
5868
    end
5869
end
5870
 
5871
ROT()
5872
 
5873
game.ReplicatedStorage.DescendantRemoving:connect(function(itm)
5874
    if itm.Name == "GKAttachment" then
5875
        wait(2)
5876
        RF = game.ReplicatedStorage:findFirstChild("GKAttachment") or nil
5877
    end
5878
end)
5879
TabsInWorkspace = true;
5880
Tablet("GK // REWRITE has loaded!", Colors.Lime)
5881
Tablet("Gatekeeper was originally made by noliCAIKS", Colors.Orange)
5882
Tablet("This version of Gatekeeper is being developed by areno2002", Colors.SoftBlue)
5883
GraphicalEffects.CrystalRing({base_part = Player.Character.Torso, fade_out_color = BrickColor.new("Toothpaste"), crystal_color = BrickColor.new("Lime green"), crystal_count = 10, float_duration = 1})
5884
Player.Chatted:connect(function(msg) if string.sub(msg,1,1) == "/" then onChatted(msg) else ChatBubble.Create(msg) end end)
5885
if script:IsA("LocalScript") then Mouse.Button1Down:connect(CheckHotKey) end
5886
-- Its very similar to the #15