Player Start Script is affecting those who already joined

  1. 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.

  2. 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.

  3. 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

Have you tried doing it in local scripts?