Hierarchy:
- Tool
- Script
- LocalScript
- RemoteEvent
Server Script:
local tool = script.Parent
local lib = require(game.ServerStorage.Library)
local detain = tool:WaitForChild("Detain")
local detained = {}
local detainedChar
local connections = {}
local function removeTools(chr)
for _,obj in next, chr:GetChildren() do
if obj:IsA("Tool") or obj:IsA("HopperBin") then
wait()
obj.Parent = game.Players:GetPlayerFromCharacter(chr).Backpack
end
end
end
local function setCanCollide(chr, bool)
for _,obj in next, chr:GetChildren() do
if obj:IsA("BasePart") then
obj.CanCollide = bool
print(obj.Name.." is now set CanCollide to "..tostring(bool))
end
setCanCollide(obj, bool)
end
end
detain.OnServerEvent:connect(function(plr, type, detainee, code)
if code ~= "PQ8pYaSCNp" then print("Wrong code, "..detainee.Name..". Try again next time.") return end
local hum = lib.GetHumanoid(detainee)
if type == "Detain" then
print(detained[detainee]) -- this prints nothing!
if detained[detainee] then print(plr.Name.." tried to detain "..detainee.Name.." but he/she was already detained.") return end -- this doesn't print when someone is detained, and someone else tries to detain them!
print("Detaining "..detainee.Name)
detained[detainee] = true
spawn(function() for i,v in next, detained do
print(tostring(i).." is detained.")
end end)
setCanCollide(detainee, false)
detainee.Torso.Anchored = true
hum.JumpPower = 0
hum.WalkSpeed = 0
connections[1] = detainee.ChildAdded:connect(function()
removeTools(detainee)
end)
connections[2] = lib.GetHumanoid(plr.Character).Died:connect(function()
detained[detainee] = false
end)
removeTools(detainee)
spawn(function()
while detained[detainee] do
wait()
detainee:SetPrimaryPartCFrame(plr.Character:GetPrimaryPartCFrame() * CFrame.new(0, 0, -2.5))
end
end)
detain:FireClient(plr, true)
elseif type == "Undetain" then
print("Undetaining "..detainee.Name)
detainee.Torso.Anchored = false
hum.JumpPower = 50
hum.WalkSpeed = 16
setCanCollide(detainee, true)
detained[detainee] = false
for i,v in next, connections do v:disconnect() end
detain:FireClient(plr, false)
end
end)
LocalScript:
local plr = game.Players.LocalPlayer
local m = plr:GetMouse()
local chr = plr.Character or plr.CharacterAdded:wait()
local tool = script.Parent
local detain = tool:WaitForChild("Detain")
local code = "PQ8pYaSCNp"
local detainee = false
local last
tool.Activated:connect(function()
if not detainee then
local detained = game.Players:GetPlayerFromCharacter(m.Target.Parent).Character -- just to make sure it's an actual player, k?
if detained then
detain:FireServer("Detain", detained, code)
end
last = detained
elseif detainee then
detainee = false
detain:FireServer("Undetain", last, code)
end
end)
detain.OnClientEvent:connect(function(bool)
detainee = bool
end)
This script is suppose to only allow one person to detain a specified player at a time.
Okay, so my problem is that "detained[detainee]" is never set to true (I think?), because when someone is detained and someone else tries to detain them, it never prints "Player tried to detain Player1, but Player1 was already detained".
Anyone know why this debounce isn't working? Probably a stupid question, but I need help.
Most of the problems are on lines 31, and 32.
