Scripting Helpers is winding down operations and is now read-only. More info→
Ad
Log in to vote
0

Can somebody *help* with prison system for military game?

Asked by
jdzf 0
3 years ago

Greetings my fellow ROBLOX scripters and developers,

As a person new to creating games on this platform, I have had lots of help to create this sophisticated prison system which I want to work beautifully, but unfortunately I have run out of help and I am looking for a helpful person who would like to help me with this. My script currently has a GUI which is brought up when the tool is opened and you are near a player, and detains them when you press E. Then the only relevant option is to press arrest where there is a GUI for the amount of time you want them to be in jail for and a reason. And then after that the player who is being arrested should get teleported to the prison area for the suggested time, and then respawned. However, the issue is that when you press arrest, the player is only respawned and not put into jail. And the other issue is that the tool only works once - it stops working after you have used it on someone. I will put my script below (it is long) but if you know a possible solution please don't hesitate to leave a reply.

--services
local players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Http = game:GetService("HttpService")
local RunService = game:GetService("RunService")
local MarketplaceService = game:GetService("MarketplaceService")
local webhook = ""
--events
local prison = ReplicatedStorage:WaitForChild("prison")

--vars
local PrisonSystem = workspace:WaitForChild("PrisonSystem")

local processed = {}--{"player", "connection", "reason", "time", "arrestee"}

local function completeTime(player)
    local reset = false
    player.CharacterAdded:Connect(function()
        reset = true
    end)
    while not reset and wait(1) do
        if not players:FindFirstChild(player.Name) or not player.Character then
            break
        end
        for i,v in pairs(processed) do --if player is removed from processed index will adapt
            if processed[i][1].Name == player.Name then
                processed[i][4] = processed[i][4] - 1
                prison:FireClient(player, "arrest", processed[i][3], processed[i][4], processed[i][5])
            end
            if processed[i][4] <= 0 then
                processed[i] = nil
                player:LoadCharacter()
                break
            end
        end
    end
end

local function establishCell(player)
    local cells = PrisonSystem:WaitForChild("Cells"):GetChildren()
    local connection
    connection = player.CharacterAdded:Connect(function()
        local processing = false
        for i,v in pairs(processed) do
            if processed[i][1].Name == player.Name then
                processing = true
            end
        end
        wait(1)
        player.Character.HumanoidRootPart.CFrame = cells[math.random(1,#cells)].CFrame
        completeTime(player)
    end)
    if players:FindFirstChild(player.Name) then
        player:LoadCharacter()
    end
    return connection
end

local function establishConnection(player)
    for i,v in pairs(processed) do 
        if processed[i][1].Name == player.Name then
            establishCell(player)
        end
    end
end

--[[
local function postArrestLog(log) 
    assert(typeof(log) == "string", "Log needs to be a string")
    local response = Http:RequestAsync({
        Url = "https://623b9506.eu-gb.apiconnect.appdomain.cloud/usar/arrest",
        Method = "POST",
        Headers = {
            ["Content-Type"] = "application/json",
            ["X-IBM-Client-Id"] = "d67d9e82-f27f-4b42-bd46-3031c3ac234f"    
        },
        Body = Http:JSONEncode({message = log}) 
    })
    print(response.Success, response.StatusCode)
end
]]
local whiteListedGroups = {
    {"9459284", 247}, --AZNU HQ
    {"9734974", 2} --MP
}
local function checkPlayer(player)
    for i,v in pairs(whiteListedGroups) do
        if player:IsInGroup(whiteListedGroups[i][1]) and player:GetRankInGroup(whiteListedGroups[i][1]) >= whiteListedGroups[i][2] then
            return true
        end
    end
    print("Player is not whitelisted")
    return false
end

local detainedPlayers = {}
prison.OnServerEvent:Connect(function(player, status, reason, _time, holdingPlayer, auto)
    if not checkPlayer(player) then return end
    if player and player.Character and holdingPlayer and holdingPlayer.Character then
        local mag = (player.Character.HumanoidRootPart.Position - holdingPlayer.Character.HumanoidRootPart.Position).Magnitude
        if mag > 10 then
            return
        end
    end
    for i,v in pairs(processed) do --if player is removed from processed index will adapt
        if processed[i][1].Name == holdingPlayer.Name then
            return
        end
    end
    if status == "detain" then
        holdingPlayer.Character.Humanoid.WalkSpeed = 0
        prison:FireClient(holdingPlayer, status)
        detainedPlayers[holdingPlayer.Name] = holdingPlayer.Character.Head.Position
        holdingPlayer.Character.Humanoid.Died:Connect(function()
            detainedPlayers[holdingPlayer.Name] = nil
        end)
    elseif status == "release" then
        detainedPlayers[holdingPlayer.Name] = nil
        holdingPlayer.Character.Humanoid.WalkSpeed = 16
        prison:FireClient(holdingPlayer, status)
    elseif status == "arrest" then
        detainedPlayers[holdingPlayer.Name] = nil
        if _time > 900 then
            _time = 900
        elseif _time < 1 then
            _time = 1
        end
        local date = os.date("!*t")

        local embed = {
            ['embeds'] = {{
                ["title"] = "**SERVER ARREST REPORT**",
                ["description"] = "Situation: " ..holdingPlayer.Name.. " was arrested by " ..player.Name,
                ["color"] = 16711680,
                ["thumbnail"] = {
                            url = players:GetUserThumbnailAsync(holdingPlayer.UserId, Enum.ThumbnailType.HeadShot, Enum.ThumbnailSize.Size420x420)
                        },      
                ["fields"] = {
                        {
                            name = "Arrested Profile Link",
                            value = "https://www.roblox.com/users/" ..holdingPlayer.UserId.. "/profile"
                        },
                        {
                            name = "Reason:",
                            value = reason
                        },
                        {
                            name = "Sentence:",
                            value = tostring(_time).." seconds"
                        }
                        },              
                ["footer"] = {
                            text = "Arrested at Aldin Keep " ..date.month.. "/" ..date.day.. "/" ..date.year.. " at " ..date.hour.. ":" ..date.min.. " UTC"
                            --"..MarketplaceService:GetProductInfo(game.GameId).Name.."
                        }
            }}
        }

        Http:PostAsync(webhook, Http:JSONEncode(embed)) 
        table.insert(processed, {holdingPlayer, establishCell(holdingPlayer), reason, _time, player.Name})
    end
end)

RunService.Heartbeat:Connect(function()
    for _player, pos in pairs(detainedPlayers) do
        local player = players:FindFirstChild(_player)
        if player and player.Character then
            local mag = (player.Character.Head.Position - pos).Magnitude
            if mag > 50 then
                detainedPlayers[_player] = nil
                player:Kick("Leaving detained original position, automatic 15 minute arrest in place upon being in server")
            end
        end
    end
end)

players.PlayerAdded:Connect(function(player)
    establishConnection(player)
end)

Answer this question