Advertisement
Guest User

Untitled

a guest
Mar 29th, 2020
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.12 KB | None | 0 0
  1. -- Jail Script , made by user "gabkiu13" , Discord : Gab#4074
  2. -- Settings are inside the script object, editing this script may cause errors.
  3. local ReplicatedStorage = game:GetService("ReplicatedStorage")
  4. local Folder = ReplicatedStorage:WaitForChild("Arrest System")
  5. local JailSpawns = workspace:WaitForChild("JailSpawns")
  6. local Event = Folder:WaitForChild("JailEvent")
  7. local DataStoreService = game:GetService("DataStoreService")
  8. local ArrestedDataStore = DataStoreService:GetDataStore("Arrested")
  9. local ArrestedHistoryStore = DataStoreService:GetDataStore("ArrestedHistory")
  10. local Settings = require(Folder.Settings)
  11. local ArrestedTeam = Settings.ArrestedTeamName
  12. local AfterTeam = Settings.AfterTeamName
  13. local Players = game:GetService("Players")
  14. local GetDataEvent = Folder:WaitForChild("GetData")
  15. local Commands = Settings.Commands
  16. local WhoCanUseCommands = Settings.CanUseCommands
  17.  
  18. local DataSeparator = "|ç^"
  19. local HistorySeparator = "^çº"
  20.  
  21. local CurrentArrested = {}
  22. local PlayersArrestedHistory = {}
  23. local CurrentDetained = {}
  24. local CurrentDetaining = {}
  25.  
  26. spawn(function()
  27. for _,player in pairs(WhoCanUseCommands) do
  28. WhoCanUseCommands[player] = true
  29. end
  30. end)
  31.  
  32. local function PlayerCanArrest(Player,Target)
  33. local okay = false
  34. for _,Data in pairs(Settings.AllowedGroups) do
  35. local GroupId = Data.GroupId
  36. local MinimunRank = Data.MinimunRank
  37. if Player:IsInGroup(GroupId) then
  38. if Player:GetRankInGroup(GroupId) >= MinimunRank then
  39. okay = true
  40. end
  41. end
  42. end
  43. if okay then
  44. return (Player.Character.HumanoidRootPart.Position - Target.Character.HumanoidRootPart.Position).magnitude <= Settings.MaxActivationDistance
  45. end
  46. return false
  47. end
  48. local function GetTime()
  49. local date = os.date("!*t")
  50. local day = tostring(date.day)
  51. if day:len() < 2 then
  52. day = "0" .. day
  53. end
  54. local month = tostring(date.month)
  55. if month:len() < 2 then
  56. month = "0" .. month
  57. end
  58. return month .. "/" .. day .. "/" .. date.year
  59. end
  60. local function SaveArrestHistoryDataToStore(Target)
  61. local key = Target.UserId
  62. local DataBase = PlayersArrestedHistory[Target.Name]
  63. for i,v in pairs(DataBase) do
  64. v.Target = tostring(v.Target)
  65. end
  66. ArrestedHistoryStore:SetAsync(tostring(Target.UserId),DataBase)
  67. PlayersArrestedHistory[Target.Name] = nil
  68. CurrentArrested[Target.Name] = nil
  69. end
  70. local function GetCurrentArrestData(Target)
  71. return ArrestedDataStore:GetAsync(tostring(Target.UserId))
  72. end
  73. local function IncrementLocalHistory(Data)
  74. if PlayersArrestedHistory[Data.Target.Name] == nil then
  75. PlayersArrestedHistory[Data.Target.Name] = {}
  76. end
  77. table.insert(PlayersArrestedHistory[Data.Target.Name],{
  78. SenderName = Data.SenderName,
  79. Target = Data.Target,
  80. Time = Data.Time,
  81. Reason = Data.Reason,
  82. Date = GetTime(),
  83. NumberDate = os.time()
  84. })
  85. end
  86. local function LoadRawHistory(Target)
  87. local DataBase = ArrestedHistoryStore:GetAsync(tostring(Target.UserId))
  88. PlayersArrestedHistory[Target.Name] = DataBase or {}
  89. end
  90. local function SyncOnSpawn(Target,Time)
  91. local Spawns = JailSpawns:GetChildren()
  92. local TCframe = Spawns[math.random(1,#Spawns)].CFrame + Vector3.new(0,3,0)
  93. local function tp(Character)
  94. for i=1,5 do
  95. Character:WaitForChild("HumanoidRootPart").CFrame = TCframe
  96. wait()
  97. end
  98. end
  99. math.randomseed(os.time())
  100. tp(Target.Character)
  101. local connection = Target.CharacterAdded:Connect(function(Character)
  102. tp(Character)
  103. end)
  104. return connection
  105. end
  106. local function CreateValues(Data)
  107. local Values = {
  108. Time = Instance.new("NumberValue"),
  109. SenderName = Instance.new("StringValue"),
  110. Reason = Instance.new("StringValue")
  111. }
  112. for Index,Value in pairs(Values) do
  113.  
  114. Value.Value = Data[Index]
  115. Value.Name = "Jail" .. Index
  116. Value.Parent = Data.Target
  117. end
  118. return Values
  119. end
  120. local function SyncTimeSubtraction(Data,Values)
  121. while Data.Target ~= nil and Values.Time.Value ~= 0 do
  122. wait(1)
  123. if CurrentArrested[Data.Target.Name] == nil then
  124. break
  125. end
  126. CurrentArrested[Data.Target.Name].Time = CurrentArrested[Data.Target.Name].Time -1
  127. Values.Time.Value = CurrentArrested[Data.Target.Name].Time
  128. end
  129. for _,Value in pairs(Values) do
  130. Value:Destroy()
  131. end
  132. end
  133. local function FreeArrested(Target)
  134. Target.Team = game:GetService("Teams")[AfterTeam]
  135. Target:LoadCharacter()
  136. end
  137. local function Arrest(Data)
  138. local Target = Data.Target
  139. local UserId = tostring(Target.UserId)
  140. assert(Target.Character ~= nil)
  141. local TeleportConnection = SyncOnSpawn(Target)
  142. CurrentArrested[Target.Name] = Data
  143. Target.Team = game:GetService("Teams")[ArrestedTeam]
  144. Event:FireClient(Data.Target)
  145. -- While Arrested
  146. SyncTimeSubtraction(Data,CreateValues(Data))
  147. -- After Arrest
  148. if Target ~= nil then
  149. TeleportConnection:Disconnect()
  150. FreeArrested(Target)
  151. Data.Target = Target.Name
  152. CurrentArrested[Target.Name] = nil
  153. end
  154. end
  155. local function Undetain(Target)
  156. Target.Character:FindFirstChildOfClass("Humanoid").PlatformStand = false
  157. for _,v in pairs(CurrentDetained[Target.Name].Connections) do
  158. v:Disconnect()
  159. end
  160. CurrentDetaining[CurrentDetained[Target.Name].Sender.Name] = nil
  161. CurrentDetained[Target.Name] = nil
  162. Target.Character.DetainWeld:Destroy()
  163. end
  164. local function PlayerLeaving(Player)
  165. local ArrestData = CurrentArrested[Player.Name]
  166. if CurrentDetaining[Player.Name] then
  167. Undetain(CurrentDetaining[Player.Name])
  168. end
  169. if ArrestData ~= nil then
  170. ArrestData.Target = Player.Name
  171. ArrestedDataStore:SetAsync(tostring(Player.UserId),ArrestData)
  172. else
  173. ArrestedDataStore:SetAsync(tostring(Player.UserId),{})
  174. end
  175. SaveArrestHistoryDataToStore(Player)
  176. end
  177. local function PlayerJoined(Player)
  178. LoadRawHistory(Player)
  179. local ArrestData = GetCurrentArrestData(Player)
  180. if WhoCanUseCommands[Player.Name] then
  181. SyncChat(Player)
  182. end
  183. if ArrestData ~= nil then
  184. if ArrestData.Target ~= nil then
  185. wait(2)
  186. ArrestData.Target = Player
  187. Arrest(ArrestData)
  188. end
  189. end
  190. end
  191. local function Detain(Sender,Target)
  192. local MainChar = Sender.Character
  193. local TargetChar = Target.Character
  194. local Attachment = Instance.new("WeldConstraint")
  195. local targetPart = TargetChar.HumanoidRootPart
  196. local mainPart = MainChar.HumanoidRootPart
  197.  
  198. for i=1,3 do
  199. targetPart.CFrame = mainPart.CFrame * CFrame.new(Vector3.new(0,0,-3.25))
  200. wait()
  201. end
  202. Attachment.Name = "DetainWeld"
  203. Attachment.Part0 = mainPart
  204. Attachment.Part1 = targetPart
  205. Attachment.Parent = TargetChar
  206. TargetChar:FindFirstChildOfClass("Humanoid").PlatformStand = true
  207.  
  208. end
  209. local function PlayerRequest(Sender,Type,Target,Time,Reason)
  210. if not CurrentArrested[Sender.Name] and not CurrentDetained[Sender.Name] and not CurrentArrested[Target.Name] then
  211. if PlayerCanArrest(Sender,Target) or WhoCanUseCommands[Sender.Name] then
  212. if Type == 1 then
  213. if CurrentDetained[Target.Name] then
  214. Undetain(Target)
  215. end
  216. local Time = Time
  217. if Time > Settings.MaxTime then
  218. Time = Settings.MaxTime
  219. end
  220. local RequestData = {
  221. Date = GetTime(),
  222. SenderName = Sender.Name,
  223. Target = Target,
  224. Time = Time,
  225. Reason = Reason,
  226. NumberDate = os.time(),
  227. }
  228. IncrementLocalHistory(RequestData)
  229. Arrest(RequestData)
  230. else
  231. if not CurrentDetained[Target.Name] then
  232. Detain(Sender,Target)
  233. local Connections = {}
  234. if CurrentDetaining[Target.Name] then
  235. Undetain(CurrentDetaining[Target.Name])
  236. end
  237. table.insert(Connections,Target.Character.ChildAdded:connect(function()
  238. if CurrentDetained[Target.Name] then
  239. Target.Character.Humanoid:UnequipTools()
  240. end
  241. end))
  242. table.insert(Connections,Target.CharacterAdded:connect(function()
  243. if CurrentDetained[Target.Name] then
  244. Target.Character:WaitForChild("HumanoidRootPart")
  245. Detain(Sender,Target)
  246. end
  247. end))
  248. local f
  249. f = Sender.CharacterAdded:connect(function()
  250. if CurrentDetained[Target.Name] then
  251. Undetain(Target)
  252. else
  253. f:Disconnect()
  254. end
  255. end)
  256. table.insert(Connections,f)
  257. CurrentDetained[Target.Name] = {Sender = Sender,Tools = Target.Backpack:GetChildren(),Connections = Connections}
  258. CurrentDetaining[Sender.Name] = Target
  259. else
  260. Undetain(Target)
  261. end
  262. end
  263. end
  264. end
  265. end
  266. local function FindPlayerByShortName(str)
  267. if Players:FindFirstChild(str) then
  268. return Players:FindFirstChild(str)
  269. end
  270. for _,Player in pairs(Players:GetChildren()) do
  271. if string.find(Player.Name:lower(),str:lower()) then
  272. return Player
  273. end
  274. end
  275. end
  276. local CMDFunctions =
  277. {
  278. Arrest = function(Sender,Target,Time,Reason,...)
  279. if Target and Time and Reason then
  280. local reason = " "
  281. for _,str in pairs({...}) do
  282. reason = reason .. " ".. str
  283. end
  284. Target = FindPlayerByShortName(Target)
  285. Time = tonumber(Time)
  286. PlayerRequest(Sender,1,Target,Time,Reason .. reason)
  287. end
  288. end,
  289. Detain = function(Sender,Target)
  290. if Target then
  291. Target = FindPlayerByShortName(Target)
  292. PlayerRequest(Sender,2,Target)
  293. end
  294. end,
  295. UnDetain = function(Sender,Target)
  296. if Target then
  297. Target = FindPlayerByShortName(Target)
  298. Undetain(Target)
  299. end
  300. end,
  301. ClearHistory = function(Sender,Target,Index)
  302. local Target = FindPlayerByShortName(Target).Name
  303. if Target then
  304. if not Index then
  305. PlayersArrestedHistory[Target] = {}
  306. elseif Index == "#" then
  307. table.remove(PlayersArrestedHistory[Target],#PlayersArrestedHistory[Target])
  308. else
  309. local Numbers = {}
  310. local DataBase = PlayersArrestedHistory[Target]
  311. local OrganizedOcurrences = {}
  312. for Index,Ocurrence in pairs(DataBase) do
  313. table.insert(Numbers,Ocurrence.NumberDate)
  314. end
  315. if #Numbers ~= 1 then
  316. table.sort(Numbers)
  317. end
  318. for index,val in pairs(Numbers) do
  319. for _,Ocurrence in pairs(DataBase) do
  320. if Ocurrence.NumberDate == val then
  321. if index ~= tonumber(Index) then
  322. table.insert(OrganizedOcurrences,Ocurrence)
  323. end
  324. end
  325. end
  326. end
  327. PlayersArrestedHistory[Target] = OrganizedOcurrences
  328. end
  329. end
  330. end,
  331. UnArrest = function(Sender,Target)
  332. if Target then
  333. local Data = CurrentArrested[Target] or CurrentArrested[FindPlayerByShortName(Target).Name]
  334. if Data then
  335. Data.Time = 1
  336. for Index,NData in pairs(PlayersArrestedHistory[Data.Target.Name]) do
  337. if NData.NumberDate == Data.NumberDate then
  338. table.remove(PlayersArrestedHistory[Data.Target.Name],Index)
  339. break
  340. end
  341. end
  342. end
  343. end
  344. end,
  345. }
  346. function SyncChat(Target)
  347. Target.Chatted:connect(function(msg)
  348. for Index,StrCommand in pairs(Commands) do
  349. if string.find(msg,StrCommand) then
  350. local args = msg:split(" ")
  351. table.remove(args,1)
  352. CMDFunctions[Index](Target,unpack(args))
  353. end
  354. end
  355. end)
  356. end
  357.  
  358.  
  359. Players.PlayerAdded:Connect(PlayerJoined)
  360. Players.PlayerRemoving:Connect(PlayerLeaving)
  361. Event.OnServerEvent:Connect(PlayerRequest)
  362. game:BindToClose(function()
  363. for _, client in ipairs(Players:GetPlayers()) do
  364. PlayerLeaving(client)
  365. end
  366. end)
  367. GetDataEvent.OnServerInvoke = function(Player,Target)
  368. return PlayersArrestedHistory[Target.Name] or {}
  369. end
  370. wait(7.2)
  371. --PlayerRequest(game.Players.gabkiu13,1,game.Players.gabkiu13,15,"None")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement