Advertisement
jhonny44

safeguard

Aug 26th, 2016
199
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 18.76 KB | None | 0 0
  1. --SafeGuard Version 1.1.0 rewrite 3 Development Build 4
  2. --This version of SafeGuard is a development build! Only the core features are functional!
  3.  
  4. --NOTICE : This Version of SafeGuard includes new technology for removing unwanted scripts.
  5. --This new technology requires to be loaded before the unwanted scripts are loaded.
  6. --Also, this feature is under beta! I am not sure if it will work successfully!
  7.  
  8. local LicenseKey = ""
  9. local g = game
  10. local plyrs = g:service("Players")
  11. local ws = g:service("Workspace")
  12. local lg = g:service("Lighting")
  13. local sg = g:service("StarterGui")
  14. local sp = g:service("StarterPack")
  15. local d = g:service("Debris")
  16. local ss = g:service("SoundService")
  17. local sc = g:service("ScriptContext")
  18.  
  19.  
  20. if not script then
  21. local h = Instance.new("Message",Workspace)
  22. h.Text = "SafeGuard 1.1.0 rw3 FATAL ERROR | script is undefined!"
  23. wait(4)
  24. h:destroy()
  25. end
  26.  
  27. local s = script
  28. local sbk = script
  29.  
  30. if not script.Parent == nil then wait() script:destroy() end
  31.  
  32.  
  33. --Now that we have the predefine stuff out of the way, let's define our table!'
  34.  
  35. sg = {}
  36. sg.Functions = {}
  37. sg.Settings = {}
  38. sg.Data = {}
  39. sg.EmergeControl = {}
  40. sg.GUI = {}
  41. sg.Commands = {} --This is where all commands are stored. Makes it easier to control. =D
  42. sg.Players = {}
  43. sg.Init = {} --We'll call this to start everything. For now, it will be blank.
  44.  
  45. sg.Settings.ProtectedUnit = "999kko"
  46. sg.Settings.Service = "enabled"
  47. sg.Settings.EmergeControl = "disabled"
  48. sg.Settings.sysActivation = "check"
  49. sg.Settings.sysCreators = {"samdisk11", "samdisk11"} --Don't define yet, since we haven't started selling yet! ;D
  50. sg.Settings.MaxNumOfNotifications = 8
  51. sg.Settings.NotificationsEnabled = true
  52. sg.Settings.BreakLoop = false
  53.  
  54. sg.Data.curVer = "1.1.0 rw3"
  55. sg.Data.NotAllowed = {} --Naughty list. ;)
  56. sg.Data.AuthorizedPlaces = {} --These are places the script is authorized to use InsertService for itself.
  57. sg.Data.LoadedScript = {}
  58. sg.Data.Services = {"BadgeService","CoreGui","StarterGui","ChangeHistoryService","Chat","CollectionService","ContentFilter","ContentProvider","ControllerService","Debris","FlagStandService","FriendService","Geometry","GuiService","GuidRegistryService","InsertService","Lighting","LocalBackpack","MeshContentProvider","NetworkClient","NetworkServer","Workspace","PhysicsService","RunService","ScriptContext","ScriptInformationProvider","Selection","SocialService","SoundService","SpawnerService","Stats","StarterPack","Teams","TeleportService","TextService","Timer","VirtualUser","Visit","RenderHooksService"}
  59. sg.Data.LoadedServices = {} --Theses are the services have been loaded! We keep them here to clean them.
  60.  
  61. --Phew, that was a LOT of services! Hopefully, we can get everything we want to get rid of!
  62.  
  63. --Let's define our Functions!
  64.  
  65. --[[Script Indexer |New method for removing scripts| ]]
  66. sg.Functions.AddNewScript = function(ins)
  67. if ins == script then return end
  68. if ins:isA"Script" or ins:isA"LocalScript" then
  69. if not ins:findFirstChild("DSource") then return end
  70. sg.Data.LoadedScript[ins.Name] = ins
  71. sg.Functions.gNotification("New Script "..ins:GetFullName().." was added to the database!")
  72. end
  73. end
  74.  
  75. --This will give us additional abilities to remove scripts that attempt to hide themselves.
  76. game.DescendantAdded:connect(sg.Functions.AddNewScript)
  77.  
  78.  
  79. --[[Add Command |Adds a new command for SafeGuard users| ]]
  80. sg.Functions.AddCommand = function(commandName,commandChat,callFunc,issionRequirement,description)
  81. sg.Commands[commandName] = {
  82. ["CommandName"] = commandName,
  83. ["CommandChatCall"] = commandChat,
  84. ["CommandFunction"] = callFunc,
  85. ["CommandissionRequirement"] = issionRequirement,
  86. ["CommandDescription"] = description}
  87. if not sg.Commands[commandName] then
  88. sg.Functions.gNotification("Unable to add command "..commandName.."!")
  89. end
  90. end
  91.  
  92. --[[Get Commands |Retrieves the requested command. If command doesn't exist, returns NONEXISTANT_COMMAND|]]
  93. sg.Functions.GetCommand = function(commandName)
  94. if not sg.Commands[commandName] then return "NONEXISTANT_COMMAND" end
  95. return sg.Commands[commandName]
  96. end
  97.  
  98. --[[Check ission Level |Checks the ission Level against the provided command. |]]
  99. sg.Functions.CheckissionLevel = function(player,command)
  100. if not sg.Commands[command] then sg.Functions.Notification(player,"That command doesn't exist!") return end
  101. local per = sg.Functions.GetissionLevel(player.Name)
  102. if sg.Commands[command]["CommandissionRequirement"] > per then
  103. return false
  104. else
  105. return true
  106. end
  107. end
  108.  
  109. --[[Sandboxed Loadstring |Loads the Source in a Sandboxed Enviroment. |]]
  110. sg.Functions.SandboxLoadstring = function(Source)
  111. local Func = loadstring(Source or "")
  112. setfenv(Func,{___ENV = getfenv(1)})
  113. return coroutine.wrap(Func)
  114. end
  115.  
  116. --[[Loadstring |Loads the lua source. |]]
  117. sg.Functions.Loadstring = function(source,Speaker)
  118. local Func,error = loadstring(source)
  119. if error == nil then
  120. coroutine.wrap(function()
  121. Func()
  122. end)()
  123. sg.Functions.Notification(Speaker,"QuickScript successful!")
  124. else
  125. sg.Functions.Notification(Speaker,"QuickScript failed! ERROR - "..tostring(error))
  126. end
  127. end
  128.  
  129. sg.Functions.RegisterPlayer = function(player,playerissionLevel)
  130. if sg.Players[player.Name] then
  131. repeat wait() until player.DataReady
  132. sg.Players[player.Name]["PlayerInstance"] = player
  133. coroutine.wrap(function()
  134. pcall(function() player["PlayerGui"]["SafeGuard_GUI"]:destroy() end)
  135. pcall(function() local a = Instance.new("ScreenGui",player.PlayerGui) a.Name = "SafeGuard_GUI" end)
  136. end)()
  137. if sg.Functions.CheckIfBanned(player.Name) then return end
  138. player.Chatted:connect(sg.Functions.OnChatted)
  139. sg.Functions.gNotification("Welcome back "..player.Name.."!") return end
  140. sg.Players[player.Name] = {
  141. ["PlayerInstance"] = player,
  142. ["PlayerName"] = player.Name,
  143. ["PlayerFullName"] = player:GetFullName(),
  144. ["issionLevel"] = playerissionLevel,
  145. ["UserID"] = player.userId,
  146. ["isBanned"] = false,
  147. ["scriptingAllowed"] = true}
  148. if not sg.Players[player.Name] then
  149. sg.Functions.gNotification("Failed to create Player Index for Player "..player.Name.."!")
  150. sg.Functions.Notification(player,"I was unable to create your Registeration. Please report this error to scottkid")
  151. wait(3)
  152. player:destroy()
  153. else
  154. sg.Functions.Notification(player,"SafeGuard has successfully registered you! Your ission level is "..sg.Players[player.Name].issionLevel.."!")
  155. wait(3)
  156. sg.Functions.Notification(player,"Connecting your Commands...")
  157. if pcall(function() player.Chatted:connect(sg.Functions.OnChatted) end) == false then
  158. sg.Functions.Notification(player,"Failed to connect your commands! Please report this error to scottkid!")
  159. else
  160. sg.Functions.Notification(player,"Your commands were connected successfully! ission Level - "..sg.Players[player.Name]["issionLevel"]..". |")
  161. end
  162. end
  163. end
  164.  
  165. sg.Functions.GetPlayer = function(playerName)
  166. if not sg.Players[playerName] then return "NONEXISTANT_PLAYER" end
  167. return sg.Players[playerName]
  168. end
  169.  
  170. sg.Functions.CheckIfBanned = function(playerName)
  171. local p = sg.Functions.GetPlayer(playerName)
  172. if p == "NONEXISTANT_PLAYER" then sg.Functions.gNotification("Player "..playerName.." doesn't exist!") return end
  173. if p.isBanned == true then
  174. ypcall(function() plyrs:findFirstChild(p["PlayerName"]):destroy() end)
  175. sg.Functions.gNotification("Player "..p["PlayerName"].." is banned from this server!")
  176. return true
  177. else
  178. return false
  179. end
  180. end
  181.  
  182. sg.Functions.gNotification = function(message)
  183. if sg.Settings.NotificationsEnabled == false then return end
  184. for i,v in pairs(plyrs:GetChildren()) do
  185. if not v:findFirstChild("PlayerGui") then Instance.new("PlayerGui",v) end
  186. coroutine.wrap(function()
  187. local gui = v["PlayerGui"]
  188. if not gui:findFirstChild("SafeGuard_GUI") then local a = Instance.new("ScreenGui",gui) a.Name = "SafeGuard_GUI" end
  189. local f = Instance.new("Frame",gui["SafeGuard_GUI"])
  190. f.Name = "Msg"
  191. f.ZIndex = 7
  192. f.Visible = false
  193. local t = Instance.new("TextButton",f)
  194. t.Name = "MessageBox"
  195. t.Text = "SafeGuard "..sg.Data.curVer.." | "..tostring(message)
  196. t.FontSize = "Size12"
  197. f.Visible = false
  198. f.ZIndex = 7
  199. t.TextWrap = true
  200. t.Size = UDim2.new(0,1000,0,50)
  201. f.Position = UDim2.new(0,0,0,-51)
  202. f.Visible = true
  203. local Clicked = false
  204. t.MouseButton1Click:connect(function()
  205. Clicked = true
  206. t:TweenPosition(UDim2.new(0,0,0,-51))
  207. wait(1.5)
  208. f:destroy()
  209. end)
  210. coroutine.wrap(function()
  211. local num = 0
  212. for i,v in pairs(gui["SafeGuard_GUI"]:GetChildren()) do
  213. if v.Name == "Msg" then
  214. num = num + 1
  215. end
  216. end
  217. if num == 1 then
  218. t:TweenPosition(UDim2.new(0,0,0,400))
  219. elseif num == 2 then
  220. t:TweenPosition(UDim2.new(0,0,0,450))
  221. elseif num == 3 then
  222. t:TweenPosition(UDim2.new(0,0,0,500))
  223. elseif num == 4 then
  224. t:TweenPosition(UDim2.new(0,0,0,550))
  225. elseif num == 5 then
  226. t:TweenPosition(UDim2.new(0,0,0,600))
  227. elseif num == 6 then
  228. t:TweenPosition(UDim2.new(0,0,0,650))
  229. else
  230. t:destroy()
  231. end
  232. end)()
  233. coroutine.wrap(function()
  234. wait(8)
  235. while wait() do
  236. t.BackgroundColor3 = BrickColor.new("Bright red").Color
  237. t.Text = "Click to dismiss!"
  238. wait(1.5)
  239. t.BackgroundColor3 = BrickColor.new("Medium stone grey").Color
  240. t.Text = "SafeGuard "..sg.Data.curVer.." | "..tostring(message)
  241. wait(3)
  242. end
  243. end)()
  244. end)()
  245. end
  246. end
  247.  
  248. sg.Functions.Notification = function(v,message)
  249. if pcall(function() v:findFirstChild("PlayerGui") end) == false then return end
  250. if not v:FindFirstChild("PlayerGui") then ypcall(function() Instance.new("PlayerGui",v) end) end
  251. coroutine.wrap(function()
  252. local gui = v["PlayerGui"]
  253. if not gui:findFirstChild("SafeGuard_GUI") then local a = Instance.new("ScreenGui",gui) a.Name = "SafeGuard_GUI" end
  254. local f = Instance.new("Frame",gui["SafeGuard_GUI"])
  255. f.Name = "Msg"
  256. f.ZIndex = 7
  257. f.Visible = false
  258. local t = Instance.new("TextButton",f)
  259. t.Name = "MessageBox"
  260. t.Text = "SafeGuard "..sg.Data.curVer.." | "..tostring(message)
  261. t.FontSize = "Size12"
  262. f.Visible = false
  263. f.ZIndex = 7
  264. t.TextWrap = true
  265. t.Size = UDim2.new(0,1000,0,50)
  266. f.Position = UDim2.new(0,0,0,-51)
  267. f.Visible = true
  268. local Clicked = false
  269. t.MouseButton1Click:connect(function()
  270. Clicked = true
  271. t:TweenPosition(UDim2.new(0,0,0,-51))
  272. wait(1.5)
  273. f:destroy()
  274. end)
  275. coroutine.wrap(function()
  276. local num = 0
  277. for i,v in pairs(gui["SafeGuard_GUI"]:GetChildren()) do
  278. if v.Name == "Msg" then
  279. num = num + 1
  280. end
  281. end
  282. if num == 1 then
  283. t:TweenPosition(UDim2.new(0,0,0,400))
  284. elseif num == 2 then
  285. t:TweenPosition(UDim2.new(0,0,0,450))
  286. elseif num == 3 then
  287. t:TweenPosition(UDim2.new(0,0,0,500))
  288. elseif num == 4 then
  289. t:TweenPosition(UDim2.new(0,0,0,550))
  290. elseif num == 5 then
  291. t:TweenPosition(UDim2.new(0,0,0,600))
  292. elseif num == 6 then
  293. t:TweenPosition(UDim2.new(0,0,0,650))
  294. else
  295. t:destroy()
  296. end
  297. end)()
  298. coroutine.wrap(function()
  299. wait(8)
  300. while wait() do
  301. t.BackgroundColor3 = BrickColor.new("Bright red").Color
  302. t.Text = "Click to dismiss!"
  303. wait(1.5)
  304. t.BackgroundColor3 = BrickColor.new("Medium stone grey").Color
  305. t.Text = "SafeGuard "..sg.Data.curVer.." | "..tostring(message)
  306. wait(3)
  307. end
  308. end)()
  309. end)()
  310. end
  311.  
  312. sg.Functions.FindProtected = function()
  313. local p = plyrs:FindFirstChild(sg.Settings.ProtectedUnit)
  314. if not p then return false end
  315. if not p:isA"Player" then return false
  316. else
  317. return true
  318. end
  319. end
  320.  
  321. sg.Functions.ProtectionRun = function()
  322. local timeLeft = 30
  323. if sg.Settings.Service == "disabled" then return end
  324. --We will add EmergeControl later on.
  325. if not sg.Functions.FindProtected() then
  326. sg.Functions.CreateGlobalMessageBox()
  327. sg.Functions.UpdateGlobalMessage("Could not find Protected Player "..sg.Settings.ProtectedUnit.."!")
  328. wait(3)
  329. while not sg.Functions.FindProtected() do
  330. if timeLeft > 0 then
  331. sg.Functions.UpdateGlobalMessage(timeLeft.." second(s) until cleaning server and removing ScriptBuilder!")
  332. wait(1)
  333. timeLeft = timeLeft - 1
  334. else
  335. break
  336. end
  337. end
  338. if not sg.Functions.FindProtected() then
  339. sg.Functions.UpdateGlobalMessage("Cleaning server and removing ScriptBuilder...")
  340. for i,v in pairs(sg.Players) do
  341. coroutine.wrap(function()
  342. ypcall(function() sg.Functions.noSB(v["PlayerInstance"]) end)
  343. end)()
  344. end
  345. ypcall(function() sg.Functions.CleanGame() end)
  346. else
  347. sg.Settings.BreakLoop = true
  348. sg.Functions.UpdateGlobalMessage("Found Protected Player "..sg.Settings.ProtectedUnit.."!")
  349. wait(3)
  350. sg.Functions.UpdateGlobalMessage("System returning to idle!")
  351. wait(2)
  352. sg.Functions.DismissGlobalMessage()
  353. end
  354. timeLeft = 240
  355. while not sg.Functions.ProtectedUnit() do
  356. if timeLeft > 0 then
  357. sg.Functions.UpdateGlobalMessage(timeLeft.." second(s) until SHUTDOWN!")
  358. wait(1)
  359. timeLeft = timeLeft - 1
  360. else
  361. break
  362. end
  363. end
  364. if not sg.Functions.ProtectedUnit() then
  365. sg.Functions.UpdateGlobalMessage("EXECUTING SERVER SHUTDOWN!")
  366. wait(2)
  367. Instance.new("Manu"..tostring("al").."Surfa"..tostring("ceJoint").."Instance",ws)
  368. else
  369. sg.Settings.BreakLoop = true
  370. sg.Functions.UpdateGlobalMessage("Found Protected Player "..sg.Settings.ProtectedUnit.."!")
  371. wait(3)
  372. sg.Functions.UpdateGlobalMessage("System returning to idle!")
  373. wait(2)
  374. sg.Functions.DismissGlobalMessage()
  375. end
  376. end
  377. end
  378.  
  379. sg.Functions.CleanGame = function()
  380. if #sg.Data.LoadedScripts == 0 then return end
  381. for i,v in pairs(sg.Data.LoadedScripts) do
  382. v.Disabled = true
  383. v:destroy()
  384. end
  385. end
  386.  
  387. sg.Functions.noSB = function(v)
  388. if not v then return end
  389. coroutine.wrap(function()
  390. while wait(.5) do
  391. if sg.Settings.BreakLoop == true then break end
  392. ypcall(function() v["PlayerGui"]["SafeGuard_GUI"]["SMsg"]:destroy() end)
  393. end
  394. end)()
  395. end
  396.  
  397. sg.Functions.CreateMessageBox = function(pl,title,msg)
  398. local p = sg.Functions.GetPlayer(pl)
  399. if title == nil then title = "SafeGuard Global Message" end
  400. if msg == nil then msg = "Waiting for Update..." end
  401. if not p then return end
  402. if not p["PlayerInstance"] then return end
  403. if not p["PlayerInstance"]:findFirstChild("PlayerGui") then Instance.new("PlayerGui",p["PlayerInstance"]) end
  404. if not p["PlayerInstance"]:findFirstChild("PlayerGui") then return end
  405. if not p["PlayerInstance"]["PlayerGui"]:findFirstChild("SafeGuard_GUI") then Instance.new("ScreenGui",p["PlayerInstance"]["PlayerGui"]).Name = "SafeGuard_GUI" end
  406. if not p["PlayerInstance"]["PlayerGui"]:findFirstChild("SafeGuard_GUI") then return end
  407. local sg = p["PlayerInstance"]["PlayerGui"]["SafeGuard_GUI"]
  408. local f = Instance.new("Frame",sg)
  409. f.Name = "SMsg"
  410. f.Visible = false
  411. local title = Instance.new("TextLabel",f)
  412. title.Name = "Title"
  413. local box = Instance.new("TextLabel",f)
  414. box.Name = "Box"
  415. title.Position = UDim2.new(0,-600,0,-250)
  416. title.Size = UDim2.new(0,600,0,50)
  417. box.Position = UDim2.new(0,-600,0,-300)
  418. box.Size = UDim2.new(0,600,0,100)
  419. title.FontSize = "Size18"
  420. box.FontSize = "Size14"
  421. box.TextWrap = true
  422. f.Visible = true
  423. box:TweenPosition(UDim2.new(0,0,0,200))
  424. title:TweenPosition(UDim2.new(0,0,0,150))
  425. title.Text = tostring(title)
  426. box.Text = tostring(msg)
  427. end
  428.  
  429. sg.Functions.CreateGlobalMessageBox = function()
  430. for i,v in pairs(plyrs:GetPlayers()) do
  431. coroutine.wrap(function()
  432. sg.Functions.CreateMessageBox(v.Name,nil,nil)
  433. wait()
  434. end)()
  435. end
  436. end
  437.  
  438. sg.Functions.UpdateGlobalMessage = function(msg)
  439. for i,v in pairs(plyrs:GetPlayers()) do
  440. coroutine.wrap(function()
  441. if not v:findFirstChild("PlayerGui") then sg.Functions.CreateMessageBox(v,nil,nil) end
  442. if not v["PlayerGui"]:findFirstChild("SafeGuard_GUI") then sg.Functions.CreateMessageBox(v,nil,nil) wait() end
  443. ypcall(function() v["PlayerGui"]["SafeGuard_GUI"]["SMsg"]["Box"].Text = tostring(msg) end)
  444. end)()
  445. end
  446. end
  447.  
  448. sg.Functions.DismissGlobalMessageBox = function()
  449. for i,v in pairs(plyrs:GetPlayers()) do
  450. coroutine.wrap(function()
  451. ypcall(function() v["PlayerGui"]["SafeGuard_GUI"]["SMsg"]:destroy() end)
  452. end)()
  453. end
  454. end
  455.  
  456. sg.Functions.LoadServices = function()
  457. for i,v in pairs(sg.Data.Services) do
  458. if ypcall(function() sg.Data.Services[v] = game:service(v) end) then
  459. print("Loaded "..tostring(v).."!")
  460. else
  461. print("Failed to load "..tostring(v).."!")
  462. end
  463. end
  464. end
  465.  
  466. sg.Functions.GetSplit = function(msg)
  467. return msg:find(";") or nil
  468. end
  469.  
  470. sg.Functions.OnChatted = function(msg,speaker)
  471. if msg == nil or speaker == nil then return end
  472. local c = msg:lower()
  473. local plyr = sg.Functions.GetPlayer(speaker)
  474. if c:sub(1,5) == "sudo;" then
  475. if plyr["issionLevel"] > 4 then
  476. for i,v in pairs(sg.Commands) do
  477. if c:sub(6,#v.CommandChatCall+6) == v.CommandChatCall..";" then
  478. if v["issionLevelRequirement"] >= 4 then
  479. pcall(function() v.CommandFunction(c:sub(#v.CommandChatCall+6),speaker) end)
  480. else
  481. sg.Functions.Notification(plyr.PlayerInstance,"Please use the following command without su!")
  482. end
  483. end
  484. end
  485. else
  486. sg.Functions.Notification(plyr.PlayerInstance,"You do not have the ission do use su!")
  487. end
  488. elseif c:sub(1,3) == "do;" then
  489. for i,v in pairs(sg.Commands) do
  490. if c:sub(4,#v.CommandChatCall+4) == v.CommandChatCall..";" then
  491. if v["CommandissionRequirement"] >= plyr["issionLevel"] then
  492. sg.Functions.gNotification("You do not have the correct ission to use this command.")
  493. else
  494. pcall(function() v.CommandFunction(c:sub(v.CommandChatCall+4),speaker) end)
  495. end
  496. end
  497. end
  498. end
  499. end
  500.  
  501.  
  502. sg.Functions.AddCommand("System Status","sys;status",function(msg,speaker)
  503. sg.Functions.Notification(speaker,"SafeGuard Version "..sg.Data.curVer.." | Protection Status - "..sg.Settings.Service:upper().." |")
  504. end,
  505. 1,"Nothing")
  506.  
  507. sg.Functions.AddCommand("Test","test",function(msg,speaker)
  508. sg.Functions.gNotification("Test Successful!")
  509. end,
  510. 5,"Nothing")
  511.  
  512.  
  513.  
  514. sg.Functions.LoadServices()
  515.  
  516. --Now to add commands!
  517.  
  518.  
  519. sg.Functions.gNotification("SafeGuard "..sg.Data.curVer.." was loaded!")
  520.  
  521.  
  522. for i,v in pairs(plyrs:GetPlayers()) do
  523. coroutine.wrap(function()
  524. if v.Name == sg.Settings.ProtectedUnit then sg.Functions.RegisterPlayer(v,4) return end
  525. sg.Functions.RegisterPlayer(v,1)
  526. end)()
  527. end
  528.  
  529. plyrs.PlayerAdded:connect(function(p) sg.Functions.RegisterPlayer(p,1) end)
  530.  
  531. sg.Functions.gNotification("NOTICE - This is a development version of SafeGuard! Protection Service is disabled!")
  532. ypcall(function() sg.Functions.Notification(sg.Functions.GetPlayer("scottkid").PlayerInstance,"Current Location - "..script:GetFullName()) end)
  533.  
  534.  
  535. --[[coroutine.wrap(function()
  536. if sg.Settings.Service == "enabled" then
  537. sg.Functions.ProtectionRun()
  538. end
  539. end)()]]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement