Disconnecting a function somehow

I have a jail script, unfortunately I don’t know how I would disconnect the function, here is the code

function module:jailPlayer(player)
	local jailClone = jail:Clone()
	jailClone.Parent = workspace
	jailClone.SpawnPart.Position = player
	local listener
	listener = player.CharacterAdded:Connect(function()
		player.Character.HumanoidRootPart.CFrame = jailClone.PrimaryPart.CFrame
	end)
	player:LoadCharacter()
end

function module:unjailPlayer(player)
	-- disconnect the listener function somehow
end

A connection has a :Disconnect() method. To make this work, store these connections in a cache like this:

local jailcache = {}
function module:jailPlayer(player)
	if jailcache[player] then return end

	local jailClone = jail:Clone()
	jailClone.Parent = workspace
	jailClone.SpawnPart.Position = player

	jailcache[player] = player.CharacterAdded:Connect(function()
		player.Character.HumanoidRootPart.CFrame = jailClone.PrimaryPart.CFrame
	end)

	player:LoadCharacter()
end

function module:unjailPlayer(player)
	if jailcache[player] then
		jailcache[player]:Disconnect()
		jailcache[player] = nil
	end
end
--[[

# How To Use:
local JailModule = require(<path>);

local PlayerToJail = game.Players.Player1;

local JailedPlayer = JailModule.Jail(PlayerToJail);

-- Unjail player
JailedPlayer:unjail();

]]--

local Jail = {};
Jail.__index = Jail;

function Jail.Jail(player: Player)
	local self = setmetatable({}, Jail);
	
	self.Jail = jail:Clone();
	self.Player = player;
	
	self.Jail.Parent = workspace;
	self.Jail:PivotTo(player.Character.PrimaryPart.CFrame);
	
	self.listener = player.CharacterAdded:Connect(function(Character)
		Character:PivotTo(self.Jail.PrimaryPart.CFrame);
	end);
	
	player:LoadCharacter();
end;

function Jail:unjail()
	self.Jail:Destroy();
	
	if self.listener ~= nil then
		self.listener:Disconnect();
	end;
end;

return Jail;
1 Like

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.