Information in module gets wiped after being required

Not long ago, I had watched a video about StateManagers and why you should use them, and so I tried to make my own StateManager system.

After I finished the module, I wanted to of course, test it. But for some reason, when I require the module three times , the registered players are wiped. Here are my scripts:

RegisteredStates module:

local Registered = {}

local StateManager = require(script.StateManager)

local RegisteredPlayers = {}

function Registered.RegisterPlayer(Player: Player)
	if not Player or RegisteredPlayers[Player] then return end
	
	RegisteredPlayers[Player] = StateManager.new(Player)
end

function Registered.GetRegisteredStates()
	return RegisteredPlayers
end

function Registered.GetRegisteredPlayer(Player: Player)
	if not RegisteredPlayers[Player] then 
		warn(RegisteredPlayers, Player)

		return
	end
	
	warn(RegisteredPlayers)

	return RegisteredPlayers[Player]
end

function Registered.UnregisterPlayer(Player: Player)
	if not RegisteredPlayers[Player] then return end

	RegisteredPlayers[Player]:DropManager()
end

return Registered

StateManager class module:

local StateManager = {}

StateManager.__index = StateManager

function StateManager.new(Player: Player)
	if not Player then return end
	
	local State = setmetatable({}, StateManager)
		
	State.Player = Player 
	State.States = {}
	State.Tasks = {}
	
	return State
end

function StateManager:AddState(StateName: string, Duration: number)
	if table.find(self.States, StateName) then return end
	
	table.insert(self.States, StateName)
	
	if not Duration then return self.States end
	
	self.Tasks[StateName] = task.delay(Duration, function()
		if not table.find(self.States) then return end
		
		self.Tasks[StateName] = nil
		
		self:RemoveState(StateName)
	end)
end

function StateManager:FindState(StateName)
	if not table.find(self.States, StateName) then return false end
	
	return true
end

function StateManager:RemoveState(StateName)
	if not table.find(self.States, StateName) then return end
	
	table.remove(self.States, table.find(self.States, StateName))
	
	if self.Tasks[StateName] then 
		task.cancel(self.Tasks[StateName])
		
		self.Tasks[StateName] = nil
	end
end

function StateManager:DropManager()
	for _, State in self.States do
		self:RemoveState(State)
	end
	
	setmetatable(self, nil)
end

return StateManager

other scripts, here it works perfectly fine:

local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")

local Modules = ReplicatedStorage.Modules

local RegisteredStates = require(Modules.Shared.RegisteredStates)

Players.PlayerAdded:Connect(function(Player: Player)
	RegisteredStates.RegisterPlayer(Player)
end)

Players.PlayerRemoving:Connect(function(Player: Player)
	RegisteredStates.UnregisterPlayer(Player)
end)

loaded script:

local Players = game:GetService("Players")
local StarterGui = game:GetService("StarterGui")
local ReplicatedStorage = game:GetService("ReplicatedStorage")

local Remotes = ReplicatedStorage.Events.Remotes
local Server = Remotes.ServerCommunication

local Modules = ReplicatedStorage.Modules

local PlayerLoaded = Server.PlayerLoaded

local RegisteredStates = require(Modules.Shared.RegisteredStates)

Players.CharacterAutoLoads = false

Players.PlayerAdded:Connect(function(Player: Player)
	for _, Gui in StarterGui:GetChildren() do
		local Clone = Gui:Clone()
		Clone.Parent = Player.PlayerGui
		
		Clone = nil
	end
end)

PlayerLoaded.OnServerEvent:Connect(function(Player)
	Player:LoadCharacter()
	
	local State = RegisteredStates.GetRegisteredPlayer(Player)
	
	State:AddState("Loaded")
	
	warn("hi", State, RegisteredStates.GetRegisteredPlayer(Player))
end)

and if i run this code in the command bar,

warn(require(game.ReplicatedStorage.Modules.Shared.RegisteredStates).GetRegisteredStates())

it returns ‘{}’ (meaning that the table is empty?)

Theres nothing in these scripts that unregisters the player, it just decides to clear itself for no reason.

Any help is really appreciated, if I cannot fix this then ill just use configurations and attributes

1 Like

Parallel LuaU actor threads, Command bar/Plugins/Scripts run into SEPARATED environments, and if you require module from regular scripts and from command bar, you will get 2 diffirent results.

I forgot to mention that I did require the module from another module and it gave me the same result

ive rewrote the module and made it open source for whoever wants it!

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