Advertisement
xjaffie

OMG

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