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