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