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