Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- Jail Script , made by user "gabkiu13" , Discord : Gab#4074
- -- Settings are inside the script object, editing this script may cause errors.
- local ReplicatedStorage = game:GetService("ReplicatedStorage")
- local Folder = ReplicatedStorage:WaitForChild("Arrest System")
- local JailSpawns = workspace:WaitForChild("JailSpawns")
- local Event = Folder:WaitForChild("JailEvent")
- local DataStoreService = game:GetService("DataStoreService")
- local ArrestedDataStore = DataStoreService:GetDataStore("Arrested")
- local ArrestedHistoryStore = DataStoreService:GetDataStore("ArrestedHistory")
- local Settings = require(Folder.Settings)
- local ArrestedTeam = Settings.ArrestedTeamName
- local AfterTeam = Settings.AfterTeamName
- local Players = game:GetService("Players")
- local GetDataEvent = Folder:WaitForChild("GetData")
- local Commands = Settings.Commands
- local WhoCanUseCommands = Settings.CanUseCommands
- local DataSeparator = "|ç^"
- local HistorySeparator = "^çº"
- local CurrentArrested = {}
- local PlayersArrestedHistory = {}
- local CurrentDetained = {}
- local CurrentDetaining = {}
- spawn(function()
- for _,player in pairs(WhoCanUseCommands) do
- WhoCanUseCommands[player] = true
- end
- end)
- local function PlayerCanArrest(Player,Target)
- local okay = false
- for _,Data in pairs(Settings.AllowedGroups) do
- local GroupId = Data.GroupId
- local MinimunRank = Data.MinimunRank
- if Player:IsInGroup(GroupId) then
- if Player:GetRankInGroup(GroupId) >= MinimunRank then
- okay = true
- end
- end
- end
- if okay then
- return (Player.Character.HumanoidRootPart.Position - Target.Character.HumanoidRootPart.Position).magnitude <= Settings.MaxActivationDistance
- end
- return false
- end
- local function GetTime()
- local date = os.date("!*t")
- local day = tostring(date.day)
- if day:len() < 2 then
- day = "0" .. day
- end
- local month = tostring(date.month)
- if month:len() < 2 then
- month = "0" .. month
- end
- return month .. "/" .. day .. "/" .. date.year
- end
- local function SaveArrestHistoryDataToStore(Target)
- local key = Target.UserId
- local DataBase = PlayersArrestedHistory[Target.Name]
- for i,v in pairs(DataBase) do
- v.Target = tostring(v.Target)
- end
- ArrestedHistoryStore:SetAsync(tostring(Target.UserId),DataBase)
- PlayersArrestedHistory[Target.Name] = nil
- CurrentArrested[Target.Name] = nil
- end
- local function GetCurrentArrestData(Target)
- return ArrestedDataStore:GetAsync(tostring(Target.UserId))
- end
- local function IncrementLocalHistory(Data)
- if PlayersArrestedHistory[Data.Target.Name] == nil then
- PlayersArrestedHistory[Data.Target.Name] = {}
- end
- table.insert(PlayersArrestedHistory[Data.Target.Name],{
- SenderName = Data.SenderName,
- Target = Data.Target,
- Time = Data.Time,
- Reason = Data.Reason,
- Date = GetTime(),
- NumberDate = os.time()
- })
- end
- local function LoadRawHistory(Target)
- local DataBase = ArrestedHistoryStore:GetAsync(tostring(Target.UserId))
- PlayersArrestedHistory[Target.Name] = DataBase or {}
- end
- local function SyncOnSpawn(Target,Time)
- local Spawns = JailSpawns:GetChildren()
- local TCframe = Spawns[math.random(1,#Spawns)].CFrame + Vector3.new(0,3,0)
- local function tp(Character)
- for i=1,5 do
- Character:WaitForChild("HumanoidRootPart").CFrame = TCframe
- wait()
- end
- end
- math.randomseed(os.time())
- tp(Target.Character)
- local connection = Target.CharacterAdded:Connect(function(Character)
- tp(Character)
- end)
- return connection
- end
- local function CreateValues(Data)
- local Values = {
- Time = Instance.new("NumberValue"),
- SenderName = Instance.new("StringValue"),
- Reason = Instance.new("StringValue")
- }
- for Index,Value in pairs(Values) do
- Value.Value = Data[Index]
- Value.Name = "Jail" .. Index
- Value.Parent = Data.Target
- end
- return Values
- end
- local function SyncTimeSubtraction(Data,Values)
- while Data.Target ~= nil and Values.Time.Value ~= 0 do
- wait(1)
- if CurrentArrested[Data.Target.Name] == nil then
- break
- end
- CurrentArrested[Data.Target.Name].Time = CurrentArrested[Data.Target.Name].Time -1
- Values.Time.Value = CurrentArrested[Data.Target.Name].Time
- end
- for _,Value in pairs(Values) do
- Value:Destroy()
- end
- end
- local function FreeArrested(Target)
- Target.Team = game:GetService("Teams")[AfterTeam]
- Target:LoadCharacter()
- end
- local function Arrest(Data)
- local Target = Data.Target
- local UserId = tostring(Target.UserId)
- assert(Target.Character ~= nil)
- local TeleportConnection = SyncOnSpawn(Target)
- CurrentArrested[Target.Name] = Data
- Target.Team = game:GetService("Teams")[ArrestedTeam]
- Event:FireClient(Data.Target)
- -- While Arrested
- SyncTimeSubtraction(Data,CreateValues(Data))
- -- After Arrest
- if Target ~= nil then
- TeleportConnection:Disconnect()
- FreeArrested(Target)
- Data.Target = Target.Name
- CurrentArrested[Target.Name] = nil
- end
- end
- local function Undetain(Target)
- Target.Character:FindFirstChildOfClass("Humanoid").PlatformStand = false
- for _,v in pairs(CurrentDetained[Target.Name].Connections) do
- v:Disconnect()
- end
- CurrentDetaining[CurrentDetained[Target.Name].Sender.Name] = nil
- CurrentDetained[Target.Name] = nil
- Target.Character.DetainWeld:Destroy()
- end
- local function PlayerLeaving(Player)
- local ArrestData = CurrentArrested[Player.Name]
- if CurrentDetaining[Player.Name] then
- Undetain(CurrentDetaining[Player.Name])
- end
- if ArrestData ~= nil then
- ArrestData.Target = Player.Name
- ArrestedDataStore:SetAsync(tostring(Player.UserId),ArrestData)
- else
- ArrestedDataStore:SetAsync(tostring(Player.UserId),{})
- end
- SaveArrestHistoryDataToStore(Player)
- end
- local function PlayerJoined(Player)
- LoadRawHistory(Player)
- local ArrestData = GetCurrentArrestData(Player)
- if WhoCanUseCommands[Player.Name] then
- SyncChat(Player)
- end
- if ArrestData ~= nil then
- if ArrestData.Target ~= nil then
- wait(2)
- ArrestData.Target = Player
- Arrest(ArrestData)
- end
- end
- end
- local function Detain(Sender,Target)
- local MainChar = Sender.Character
- local TargetChar = Target.Character
- local Attachment = Instance.new("WeldConstraint")
- local targetPart = TargetChar.HumanoidRootPart
- local mainPart = MainChar.HumanoidRootPart
- for i=1,3 do
- targetPart.CFrame = mainPart.CFrame * CFrame.new(Vector3.new(0,0,-3.25))
- wait()
- end
- Attachment.Name = "DetainWeld"
- Attachment.Part0 = mainPart
- Attachment.Part1 = targetPart
- Attachment.Parent = TargetChar
- TargetChar:FindFirstChildOfClass("Humanoid").PlatformStand = true
- end
- local function PlayerRequest(Sender,Type,Target,Time,Reason)
- if not CurrentArrested[Sender.Name] and not CurrentDetained[Sender.Name] and not CurrentArrested[Target.Name] then
- if PlayerCanArrest(Sender,Target) or WhoCanUseCommands[Sender.Name] then
- if Type == 1 then
- if CurrentDetained[Target.Name] then
- Undetain(Target)
- end
- local Time = Time
- if Time > Settings.MaxTime then
- Time = Settings.MaxTime
- end
- local RequestData = {
- Date = GetTime(),
- SenderName = Sender.Name,
- Target = Target,
- Time = Time,
- Reason = Reason,
- NumberDate = os.time(),
- }
- IncrementLocalHistory(RequestData)
- Arrest(RequestData)
- else
- if not CurrentDetained[Target.Name] then
- Detain(Sender,Target)
- local Connections = {}
- if CurrentDetaining[Target.Name] then
- Undetain(CurrentDetaining[Target.Name])
- end
- table.insert(Connections,Target.Character.ChildAdded:connect(function()
- if CurrentDetained[Target.Name] then
- Target.Character.Humanoid:UnequipTools()
- end
- end))
- table.insert(Connections,Target.CharacterAdded:connect(function()
- if CurrentDetained[Target.Name] then
- Target.Character:WaitForChild("HumanoidRootPart")
- Detain(Sender,Target)
- end
- end))
- local f
- f = Sender.CharacterAdded:connect(function()
- if CurrentDetained[Target.Name] then
- Undetain(Target)
- else
- f:Disconnect()
- end
- end)
- table.insert(Connections,f)
- CurrentDetained[Target.Name] = {Sender = Sender,Tools = Target.Backpack:GetChildren(),Connections = Connections}
- CurrentDetaining[Sender.Name] = Target
- else
- Undetain(Target)
- end
- end
- end
- end
- end
- local function FindPlayerByShortName(str)
- if Players:FindFirstChild(str) then
- return Players:FindFirstChild(str)
- end
- for _,Player in pairs(Players:GetChildren()) do
- if string.find(Player.Name:lower(),str:lower()) then
- return Player
- end
- end
- end
- local CMDFunctions =
- {
- Arrest = function(Sender,Target,Time,Reason,...)
- if Target and Time and Reason then
- local reason = " "
- for _,str in pairs({...}) do
- reason = reason .. " ".. str
- end
- Target = FindPlayerByShortName(Target)
- Time = tonumber(Time)
- PlayerRequest(Sender,1,Target,Time,Reason .. reason)
- end
- end,
- Detain = function(Sender,Target)
- if Target then
- Target = FindPlayerByShortName(Target)
- PlayerRequest(Sender,2,Target)
- end
- end,
- UnDetain = function(Sender,Target)
- if Target then
- Target = FindPlayerByShortName(Target)
- Undetain(Target)
- end
- end,
- ClearHistory = function(Sender,Target,Index)
- local Target = FindPlayerByShortName(Target).Name
- if Target then
- if not Index then
- PlayersArrestedHistory[Target] = {}
- elseif Index == "#" then
- table.remove(PlayersArrestedHistory[Target],#PlayersArrestedHistory[Target])
- else
- local Numbers = {}
- local DataBase = PlayersArrestedHistory[Target]
- local OrganizedOcurrences = {}
- for Index,Ocurrence in pairs(DataBase) do
- table.insert(Numbers,Ocurrence.NumberDate)
- end
- if #Numbers ~= 1 then
- table.sort(Numbers)
- end
- for index,val in pairs(Numbers) do
- for _,Ocurrence in pairs(DataBase) do
- if Ocurrence.NumberDate == val then
- if index ~= tonumber(Index) then
- table.insert(OrganizedOcurrences,Ocurrence)
- end
- end
- end
- end
- PlayersArrestedHistory[Target] = OrganizedOcurrences
- end
- end
- end,
- UnArrest = function(Sender,Target)
- if Target then
- local Data = CurrentArrested[Target] or CurrentArrested[FindPlayerByShortName(Target).Name]
- if Data then
- Data.Time = 1
- for Index,NData in pairs(PlayersArrestedHistory[Data.Target.Name]) do
- if NData.NumberDate == Data.NumberDate then
- table.remove(PlayersArrestedHistory[Data.Target.Name],Index)
- break
- end
- end
- end
- end
- end,
- }
- function SyncChat(Target)
- Target.Chatted:connect(function(msg)
- for Index,StrCommand in pairs(Commands) do
- if string.find(msg,StrCommand) then
- local args = msg:split(" ")
- table.remove(args,1)
- CMDFunctions[Index](Target,unpack(args))
- end
- end
- end)
- end
- Players.PlayerAdded:Connect(PlayerJoined)
- Players.PlayerRemoving:Connect(PlayerLeaving)
- Event.OnServerEvent:Connect(PlayerRequest)
- game:BindToClose(function()
- for _, client in ipairs(Players:GetPlayers()) do
- PlayerLeaving(client)
- end
- end)
- GetDataEvent.OnServerInvoke = function(Player,Target)
- return PlayersArrestedHistory[Target.Name] or {}
- end
- wait(7.2)
- --PlayerRequest(game.Players.gabkiu13,1,game.Players.gabkiu13,15,"None")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement