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