-
What do you want to achieve? I want this script to not affect all the players that are already in game when a new player joins.
-
What is the issue? Detailed explanation, basically you choose a job and you are respawned to your certain place. When a new person joins, the process occurs to both players even the one that already did the process, the job UI doesnt show up but the player is respawned to their location.
-
What solutions have you tried so far? So I think I found why the problem is occuring but I do not have a certain way to fix it. The problem I think is that the PlayerManager module, it starts up the leaderstats, etc. I’ll show the server starting script and the module.
Server Script
local Playerss = game:GetService("Players")
local ServerScriptService = game:GetService("ServerScriptService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
ReplicatedStorage.Events.Load.Initiate.OnServerEvent:Connect(function(plr, employeesJob)
local PlayerManager = require(ServerScriptService.Data.PlayerManager)
local ShackModule = require(ServerScriptService.Modules.Shack)
local spawnLocations = game.Workspace.JobSpawns
PlayerManager.Start()
PlayerManager.PlayerAdded:Connect(function()
print("Welcome to Burger Shack!")
local newPlayerJob = ShackModule.New(plr, employeesJob)
plr.Team = employeesJob
newPlayerJob:Init()
task.wait(3)
local function changedJob()
local newJob = plr.Team
newPlayerJob:JobChanged(newJob)
end
--plr:GetPropertyChangedSignal("Team"):Connect(changedJob)
end)
end)
PlayerManager Module
local Players = game:GetService("Players")
local DataStoreService = game:GetService("DataStoreService")
local playerData = DataStoreService:GetDataStore("ShackTestCoolIKnow")
local function leaderBoardSetup(LevelsValue, ExperienceValue)
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
local Levels = Instance.new("IntValue")
Levels.Name = "Level"
Levels.Value = LevelsValue
Levels.Parent = leaderstats
local Experience = Instance.new("IntValue")
Experience.Name = "Exp"
Levels.Value = ExperienceValue
return leaderstats
end
local function LoadData(player)
local success, result = pcall(function()
return playerData:GetAsync(player.UserId)
end)
if not success then
warn(result)
end
return success, result
end
local function SaveData(player, Data)
local success, result = pcall(function()
playerData:SetAsync(player.UserId, Data)
end)
if not success then
warn(result)
end
return success
end
local SessionData = {}
local playerAdded = Instance.new("BindableEvent")
local playerRemoving = Instance.new("BindableEvent")
local PlayerManager = {}
PlayerManager.PlayerAdded = playerAdded.Event
PlayerManager.PlayerRemoving = playerRemoving.Event
function PlayerManager.Start()
for _, player in ipairs(Players:GetPlayers()) do
coroutine.wrap(PlayerManager.OnPlayerAdded)(player)
end
Players.PlayerAdded:Connect(PlayerManager.OnPlayerAdded)
Players.PlayerRemoving:Connect(PlayerManager.OnPlayerRemoving)
game:BindToClose(PlayerManager.OnClose)
end
function PlayerManager.OnPlayerAdded(player)
player.CharacterAdded:Connect(function(character)
PlayerManager.OnCharacterAdded(player, character)
end)
local success, data = LoadData(player)
SessionData[player.UserId] = success and data or {
Level = 1,
Exp = 0
}
local leaderstats = leaderBoardSetup(PlayerManager.GetLevels(player), PlayerManager.GetExp(player))
leaderstats.Parent = player
playerAdded:Fire(player)
end
function PlayerManager.OnCharacterAdded(player, character)
local humanoid = character:FindFirstChild("Humanoid")
if humanoid then
humanoid.Died:Connect(function()
task.wait(3)
player:LoadCharacter()
end)
end
end
function PlayerManager.GetLevels(player)
return SessionData[player.UserId].Level
end
function PlayerManager.GetExp(player)
return SessionData[player.UserId].Exp
end
function PlayerManager.SetLevels(player, value)
if value then
SessionData[player.UserId].Level = value
local leaderstats = player:FindFirstChild("leaderstats")
if leaderstats then
local Levels = leaderstats:FindFirstChild("Level")
if Levels then
Levels.Value = value
end
end
end
end
function PlayerManager.SetExp(player, value)
if value then
SessionData[player.UserId].Exp = value
local leaderstats = player:FindFirstChild("leaderstats")
if leaderstats then
local Experience = leaderstats:FindFirstChild("Exp")
if Experience then
Experience.Value = value
end
end
end
end
function PlayerManager.OnPlayerRemoving(player)
SaveData(player, SessionData[player.UserId])
playerRemoving:Fire(player)
end
function PlayerManager.OnClose()
for _, player in ipairs(Players:GetPlayers()) do
PlayerManager.OnPlayerRemoving(player)()
end
end
return PlayerManager