Datastore2: how to make stats given only to localplayer

the problematic place on the script is:

workspace.yesname.ClickDetector.MouseClick:Connect(function()
	 UserData.Stats.EXP = UserData.Stats.EXP + 1
	 StatsData:Set(UserData.Stats)
end)

but here’s my script just to be sure:

--variables
local DataStore2 = require(game:GetService("ServerScriptService").MainModule)
local mainkey = "DDx7632"
DataStore2.Combine(mainkey, "Stats","SOULS","ITEMS","FOOD","ARMOR")

-- data table
local function SetDataTable()
	local UserData = {
		Stats = {
			["EXP"] = 0,
			["GOLD"] = 0,
			["RESET"] = 0,
			["LOVE"] = 1
			},
		SOULS = {
			["BasicSoul"] = true,
			["Determination"] = false,
			["Integrity"] = false,
			["Justice"] = false,
			["Perseverance"] = false,
			["Kindness"] = false,
			["Bravery"] = false,
			["Patience"] = false
		},
		ITEMS = {
			["Stick"] = true,
			["REALKnife"] = false	
		},
		ARMOR = {
			["Bandage"] = true,
			["HeartLocket"] = false	
		},
		FOOD = {
			["MonsterCandy"] = 0,	
		},
	}
	return UserData
end

--main

game.Players.PlayerAdded:Connect(function(plr)
	local UserData = DataStore2(mainkey,plr):Get(SetDataTable())
	
	local gaster = Instance.new("Folder")
	gaster.Name = "TobyFox"
	local soulsfolder = Instance.new("Folder")
	soulsfolder.Name = "SOULS"
	local ITEMS = Instance.new("Folder")
	ITEMS.Name = "ITEMS"
	local ARMOR = Instance.new("Folder")
	ARMOR.Name = "ARMOR"
	local FOOD = Instance.new("Folder")
	FOOD.Name = "FOOD"
	
	--userStats
	local LOVE = Instance.new("IntValue")
	LOVE.Name = "LOVE"
	local GOLD = Instance.new("IntValue")
	GOLD.Name = "GOLD"
	local RESET = Instance.new("IntValue")
	RESET.Name = "RESET"
	local EXP = Instance.new("IntValue")
	EXP.Name = "EXP"
	
	--souls
	local BasicSoul = Instance.new("BoolValue")
	BasicSoul.Name = "BasicSoul"
	local Determination = Instance.new("BoolValue")
	Determination.Name = "Determination"
	local Justice = Instance.new("BoolValue")
	Justice.Name = "Justice"
	local Integrity = Instance.new("BoolValue")
	Integrity.Name = "Integrity"
	local Bravery = Instance.new("BoolValue")
	Bravery.Name = "Bravery"
	local Kindness = Instance.new("BoolValue")
	Kindness.Name = "Kindness"
	local Patience = Instance.new("BoolValue")
	Patience.Name = "Patience"
	local Perseverance = Instance.new("BoolValue")
	Perseverance.Name = "Perseverance"
	
	--items
	local Stick = Instance.new("BoolValue")
	Stick.Name = "Stick"
	local REALKnife = Instance.new("BoolValue")
	REALKnife.Name = "REALKnife"
	
	--Armor
	local Bandage = Instance.new("BoolValue")
	Bandage.Name = "Bandage"
	local HeartLocket = Instance.new("BoolValue")
	HeartLocket.Name = "HeartLocket"
	
	
	--Food
	local MonsterCandy = Instance.new("IntValue")
	MonsterCandy.Name = "MonsterCandy"
	
	--StoreInFolder
	local StatsData = DataStore2("Stats", plr)
	local SoulsData = DataStore2("SOULS", plr)
	local ItemsData = DataStore2("ITEMS",plr)
	local FoodData = DataStore2("FOOD", plr)
	local ArmorData = DataStore2("ARMOR", plr)
	
	--Stats data
	local function UpdateStats(UpdateValue) -- updates value to current data
		LOVE.Value = StatsData:Get(UpdateValue).LOVE
		EXP.Value = StatsData:Get(UpdateValue).EXP
		GOLD.Value = StatsData:Get(UpdateValue).GOLD
		RESET.Value = StatsData:Get(UpdateValue).RESET
	end
	
	--Soul data
	local function UpdateSouls(UpdateValue)
		BasicSoul.Value = SoulsData:Get(UpdateValue).BasicSoul
		Determination.Value = SoulsData:Get(UpdateValue).Determination
		Perseverance.Value = SoulsData:Get(UpdateValue).Perseverance
		Patience.Value = SoulsData:Get(UpdateValue).Patience
		Kindness.Value = SoulsData:Get(UpdateValue).Kindness
		Bravery.Value = SoulsData:Get(UpdateValue).Bravery
		Justice.Value = SoulsData:Get(UpdateValue).Justice
		Integrity.Value = SoulsData:Get(UpdateValue).Integrity
	end
	
	--update data
	UpdateStats(UserData.Stats)
	UpdateSouls(UserData.SOULS)
	
	StatsData:OnUpdate(UpdateStats)
	SoulsData:OnUpdate(UpdateSouls)
	
	--parent
	gaster.Parent = plr
	soulsfolder.Parent = plr
	
	--allinonestats
	--stats
	LOVE.Parent = gaster
	RESET.Parent = gaster
	EXP.Parent = gaster
	GOLD.Parent = gaster
	--Souls
	Determination.Parent = soulsfolder
	BasicSoul.Parent = soulsfolder
	Perseverance.Parent = soulsfolder
	Integrity.Parent = soulsfolder
	Justice.Parent = soulsfolder
	Kindness.Parent = soulsfolder
	Bravery.Parent = soulsfolder
	Patience.Parent = soulsfolder

workspace.yesname.ClickDetector.MouseClick:Connect(function()
 UserData.Stats.EXP = UserData.Stats.EXP + 1
 StatsData:Set(UserData.Stats)
end)

--SOULCHANGER STARTS HERE

-- kindness Soul
workspace.TemporaryHearts.Kindness.Kindness.ClickDetector.MouseClick:Connect(function()
	if Kindness.Value == true then
			UserData.SOULS["Kindness"] = false
			UserData.SOULS["BasicSoul"] = true
			SoulsData:Set(UserData.SOULS)
			Kindness.Value = false
			BasicSoul.Value = true
	elseif Kindness.Value == false then
		UserData.SOULS["Kindness"] = true
		UserData.SOULS["BasicSoul"] = false
		UserData.SOULS["Determination"] = false
		UserData.SOULS["Bravery"] = false
		UserData.SOULS["Integrity"] = false
		UserData.SOULS["Justice"] = false
		UserData.SOULS["Perseverance"] = false
		UserData.SOULS["Patience"] = false
			SoulsData:Set(UserData.SOULS)
			Kindness.Value = true
			Bravery.Value = false
			Perseverance.Value = false
			Justice.Value = false
			Integrity.Value = false
			Determination.Value = false
			BasicSoul.Value = false
			Patience.Value = false
	end
end)
--bravery Soul
workspace.TemporaryHearts.Bravery.Bravery.ClickDetector.MouseClick:Connect(function()
		if Bravery.Value == true then
			UserData.SOULS["Bravery"] = false
			UserData.SOULS["BasicSoul"] = true
			SoulsData:Set(UserData.SOULS)
			Bravery.Value = false
			BasicSoul.Value = true
	elseif Bravery.Value == false then
		UserData.SOULS["Bravery"] = true
		UserData.SOULS["BasicSoul"] = false
		UserData.SOULS["Determination"] = false
		UserData.SOULS["Kindness"] = false
		UserData.SOULS["Integrity"] = false
		UserData.SOULS["Justice"] = false
		UserData.SOULS["Perseverance"] = false
		UserData.SOULS["Patience"] = false
			SoulsData:Set(UserData.SOULS)
			Bravery.Value = true
			Kindness.Value = false
			Perseverance.Value = false
			Justice.Value = false
			Integrity.Value = false
			Determination.Value = false
			BasicSoul.Value = false
			Patience.Value = false
	end
end)
--Determination Soul
workspace.TemporaryHearts.Determination.Determination.ClickDetector.MouseClick:Connect(function()
	if Determination.Value == true then
			UserData.SOULS["Determination"] = false
			UserData.SOULS["BasicSoul"] = true
			SoulsData:Set(UserData.SOULS)
			Determination.Value = false
			BasicSoul.Value = true
	elseif Determination.Value == false then
		UserData.SOULS["Bravery"] = false
		UserData.SOULS["BasicSoul"] = false
		UserData.SOULS["Determination"] = true
		UserData.SOULS["Kindness"] = false
		UserData.SOULS["Integrity"] = false
		UserData.SOULS["Justice"] = false
		UserData.SOULS["Perseverance"] = false
		UserData.SOULS["Patience"] = false
			SoulsData:Set(UserData.SOULS)
			Bravery.Value = false
			Kindness.Value = false
			Perseverance.Value = false
			Justice.Value = false
			Integrity.Value = false
			Determination.Value = true
			BasicSoul.Value = false
			Patience.Value = false
	end
	
end)
--Patiance
workspace.TemporaryHearts.Patience.Patience.ClickDetector.MouseClick:Connect(function()
	if Patience.Value == true then
			UserData.SOULS["Patience"] = false
			UserData.SOULS["BasicSoul"] = true
			SoulsData:Set(UserData.SOULS)
			Patience.Value = false
			BasicSoul.Value = true
	elseif Patience.Value == false then
		UserData.SOULS["Bravery"] = false
		UserData.SOULS["BasicSoul"] = false
		UserData.SOULS["Determination"] = false
		UserData.SOULS["Kindness"] = false
		UserData.SOULS["Integrity"] = false
		UserData.SOULS["Justice"] = false
		UserData.SOULS["Perseverance"] = false
		UserData.SOULS["Patience"] = true
			SoulsData:Set(UserData.SOULS)
			Bravery.Value = false
			Kindness.Value = false
			Perseverance.Value = false
			Justice.Value = false
			Integrity.Value = false
			Determination.Value = false
			BasicSoul.Value = false
			Patience.Value = true
	end
	
end)
--Perseverance
workspace.TemporaryHearts.Perseverance.Perseverance.ClickDetector.MouseClick:Connect(function()
	if Perseverance.Value == true then
			UserData.SOULS["Perseverance"] = false
			UserData.SOULS["BasicSoul"] = true
			plr.SoulsData:Set(UserData.SOULS)
			Perseverance.Value = false
			BasicSoul.Value = true
	elseif Perseverance.Value == false then
		UserData.SOULS["Bravery"] = false
		UserData.SOULS["BasicSoul"] = false
		UserData.SOULS["Determination"] = false
		UserData.SOULS["Kindness"] = false
		UserData.SOULS["Integrity"] = false
		UserData.SOULS["Justice"] = false
		UserData.SOULS["Perseverance"] = true
		UserData.SOULS["Patience"] = false
			SoulsData:Set(UserData.SOULS)
			Bravery.Value = false
			Kindness.Value = false
			Perseverance.Value = true
			Justice.Value = false
			Integrity.Value = false
			Determination.Value = false
			BasicSoul.Value = false
			Patience.Value = false
	end
	
end)
--Integrity
workspace.TemporaryHearts.Integrity.Integrity.ClickDetector.MouseClick:Connect(function()
	if Bravery.Value == true then
			UserData.SOULS["Integrity"] = false
			UserData.SOULS["BasicSoul"] = true
			SoulsData:Set(UserData.SOULS)
			Integrity.Value = false
			BasicSoul.Value = true
	elseif Integrity.Value == false then
		UserData.SOULS["Bravery"] = false
		UserData.SOULS["BasicSoul"] = false
		UserData.SOULS["Determination"] = false
		UserData.SOULS["Kindness"] = false
		UserData.SOULS["Integrity"] = true
		UserData.SOULS["Justice"] = false
		UserData.SOULS["Perseverance"] = false
		UserData.SOULS["Patience"] = false
			SoulsData:Set(UserData.SOULS)
			Bravery.Value = false
			Kindness.Value = false
			Perseverance.Value = false
			Justice.Value = false
			Integrity.Value = true
			Determination.Value = false
			BasicSoul.Value = false
			Patience.Value = false
	end
	
end)
--basic
workspace.TemporaryHearts.Basic.Basic.ClickDetector.MouseClick:Connect(function()
	if BasicSoul.Value == true then
			UserData.SOULS["BasicSoul"] = false
			UserData.SOULS["BasicSoul"] = true
			SoulsData:Set(UserData.SOULS)
			BasicSoul.Value = false
			BasicSoul.Value = true
	elseif BasicSoul.Value == false then
		UserData.SOULS["Bravery"] = false
		UserData.SOULS["BasicSoul"] = true
		UserData.SOULS["Determination"] = false
		UserData.SOULS["Kindness"] = false
		UserData.SOULS["Integrity"] = false
		UserData.SOULS["Justice"] = false
		UserData.SOULS["Perseverance"] = false
		UserData.SOULS["Patience"] = false
			SoulsData:Set(UserData.SOULS)
			Bravery.Value = false
			Kindness.Value = false
			Perseverance.Value = false
			Justice.Value = false
			Integrity.Value = false
			Determination.Value = false
			BasicSoul.Value = true
			Patience.Value = false
	end
	
end)
--Justice
workspace.TemporaryHearts.Justice.Justice.ClickDetector.MouseClick:Connect(function()
	if Justice.Value == true then
			UserData.SOULS["Justice"] = false
			UserData.SOULS["BasicSoul"] = true
			SoulsData:Set(UserData.SOULS)
			Justice.Value = false
			BasicSoul.Value = true
	elseif Justice.Value == false then
		UserData.SOULS["Justice"] = true
		UserData.SOULS["BasicSoul"] = false
		UserData.SOULS["Determination"] = false
		UserData.SOULS["Kindness"] = false
		UserData.SOULS["Integrity"] = false
		UserData.SOULS["Bravery"] = false
		UserData.SOULS["Perseverance"] = false
		UserData.SOULS["Patience"] = false
			SoulsData:Set(UserData.SOULS)
			Bravery.Value = false
			Kindness.Value = false
			Perseverance.Value = false
			Justice.Value = true
			Integrity.Value = false
			Determination.Value = false
			BasicSoul.Value = false
			Patience.Value = false
	end
	
end)
--SOULCHANGER ENDS HERE






-- LEVELSYSTEM
local function onLOVEChanged(plr, EXP, LOVE)
		local reset = false
	if UserData.Stats.LOVE >= 100 then
		UserData.Stats.LOVE = 100
		reset = true
	end
end

LOVE.Changed:connect(function()
	onLOVEChanged(plr, EXP, LOVE)
end)

EXP.Changed:connect(function()
	if UserData.Stats.LOVE < 100 then
		if UserData.Stats.EXP >=  (10 + 25*UserData.Stats.LOVE)  then
		UserData.Stats.EXP = UserData.Stats.EXP - (10 + 25*UserData.Stats.LOVE)
		UserData.Stats.LOVE = UserData.Stats.LOVE + 1
		end
	end
end)
--LEVE SYSTEN END
end)

what i mean by the title is:
https://gyazo.com/683fcd121dc5fa7b550e5b0e62c95126

itachi is the random player and aviel101 is me, so basically when i"m pressing the button that gives +1 exp, it gives the exp to the whole server… and im triyng to give the stats only to the player that presses the button, help me please, thanks in advance :slight_smile:

The issue is that your ClickDetector’s MouseClick event is inside PlayerAdded. This means that for each player that’s added to the server, a point is added regardless of who clicks it.

The solution is to move the detection outside of the PlayerAdded event, and use the Player instance returned by the MouseClick event.

workspace.yesname.ClickDetector.MouseClick:Connect(function(PlayerWhoClicked)
    local YourDataStore = DataStore2("EXP", PlayerWhoClicked)  -- Here we only fetch the data store for the player who has clicked it
    YourDataStore:Increment(1) 
end)

Note that this is an example of how you could structure your system, don’t copy paste this directly and expect it to work.

wait, so you don’t need to create a localscript and write everything in the same script but outside of the plr added function?

If you created a Localscript, you would have to create a RemoteEvent to tell the server to increment EXP. This can potentially be abused by exploiters. It is safer to do this on the server since you can verify that the person who clicked it is the one who will receive the EXP, as the MouseClick event will only return the Player instance of the player who clicked it. Just move the event function outside of PlayerAdded and set your code up like the example above.

2 Likes

ok worked thanks, i did something like this

workspace.yesname.ClickDetector.MouseClick:Connect(function(PlayerWhoClicked)
	UserData = DataStore2(mainkey,PlayerWhoClicked):Get(SetDataTable())
	local StatsData = DataStore2("Stats", PlayerWhoClicked)
	 UserData.Stats.EXP = UserData.Stats.EXP + 1
	StatsData:Set(UserData.Stats)
end)
1 Like