I have this field of view slider that changes the cameras field of view, and I am trying to get it to save the field of view sliders position. It was working fine with normal DataStore but doesn't seem to be working with DataStore2.

I followed this AlvinBlox tutorial https://www.youtube.com/watch?time_continue=4&v=hBfMfB0BwGA&feature=emb_logo

This is the data store 2 code:

local SeverScriptService = game:GetService("ServerScriptService")
local DataStore2 = require(SeverScriptService:WaitForChild("DataStore2"))	
local DefaultValue = 0.771



local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:WaitForChild("GuiPositionSave")

game.Players.PlayerAdded:Connect(function(Plr)
	local FOVStore = DataStore2("FOVSave", Plr)
	--Folder
	local SettingsSaveFolder = Instance.new("Folder", Plr)
	SettingsSaveFolder.Name = "SettingsData"
	
	--FOV
	local FieldOfView = Instance.new("NumberValue", SettingsSaveFolder)
	FieldOfView.Name = "FovValue"
	
	local function pointsUpdate(updatedValue)
		FieldOfView.Value = FOVStore:Get(updatedValue)
		
	end
	pointsUpdate(DefaultValue)
	
	FOVStore:OnUpdate(pointsUpdate)
end)

local function GuiChangerPos(player, GuiPos)
	local FOVStore = DataStore2("FovSave", player)
		FOVStore:Increment(GuiPos,DefaultValue)

-------------------LINES THAT HAVE BEEN COMMENTED OUT---------------------------------------------
	--local FovVal = player:FindFirstChild("SettingsData").FovValue
         --FovVal.Value = GuiPos    ---IF I ENABLE THESE LINES THE VALUE CHANGES WHEN I DRAG THE SLIDER
end

local function ResetSliderToDefaultPosition(player, GuiPos)
	local FOVStore = DataStore2("FovSave", player)
       FOVStore:Increment(GuiPos,DefaultValue)   -

-------------------LINES THAT HAVE BEEN COMMENTED OUT---------------------------------------------
	--local FovVal = player:FindFirstChild("SettingsData").FovValue
	--FovVal.Value = GuiPos   ---IF I ENABLE THESE LINES THE VALUE CHANGES WHEN I CLICK A BUTTON, WHICH CHANGES THE VALUE BACK THE DEFAULT FOV

	
end


game.ReplicatedStorage.FOVval.OnServerEvent:Connect(GuiChangerPos)

game.ReplicatedStorage.FOVval2.OnServerEvent:Connect(ResetSliderToDefaultPosition)


this is the local slider script
local sliderBG = script.Parent

local slider = sliderBG:WaitForChild("Slider")
--local sliderBox = sliderBG:WaitForChild("SliderInput")
local uis = game:GetService("UserInputService")
local Rus = game:GetService("RunService")
local player = game.Players.LocalPlayer
local SettingsStats = player:WaitForChild("SettingsData")
local FovVal = SettingsStats:WaitForChild("FovValue")
local Slider = script.Parent.Slider
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local RepRemote = ReplicatedStorage:WaitForChild("FOVval")

--Variables
local function PlayersAdded()
		Slider.Position = UDim2.new(FovVal.Value,0,-4,0)
end




FovVal.Changed:Connect(function() --If value changes
	if Slider then
		Slider.Position = UDim2.new(FovVal.Value,0,-4,0)
	end
end)

local noofstops = 120

local buttonHold = false
local percentage = 0

--actual code 
local stops = 1/noofstops
--local stops = 0.01

function dowork(number, value)
	if value == 1 then
		return number
		
	else
		return math.floor(number/value+.5)*value
	end
	
end


																																		
uis.InputEnded:Connect(function(key, processed)
	if key.UserInputType == Enum.UserInputType.MouseButton1 then
		buttonHold = false
	end
	
end)

script.Parent.Slider.TextButton.MouseButton1Down:Connect(function()
	buttonHold = true
end)

Rus.RenderStepped:Connect(function(alpha)
	if buttonHold then
		game.ReplicatedStorage.FOVval:FireServer(script.Parent.Slider.Position.X.Scale) ----EVENT FIRES IF BUTTON HOLD = TRUE. Also sends over the Sliders X position

		local FovData = player:WaitForChild("SettingsData")
		local FovValue = FovData:WaitForChild("FovValue")
		local mouseLocation = uis:GetMouseLocation().X
		local buttonPosition = slider.Position
		local SliderSize = sliderBG.AbsoluteSize.X
		local sliderPosition = sliderBG.AbsolutePosition.X
		local position = dowork((mouseLocation-sliderPosition)/SliderSize, stops)
		percentage = math.clamp(position,0,1)
		slider.Position = UDim2.new(percentage,0,buttonPosition.Y.Scale, buttonPosition.Y.Offset)
	end
end)


game.Players.PlayerAdded:Connect(PlayersAdded)
for _, player in ipairs(game.Players:GetPlayers()) do
	PlayersAdded(player)
end


What should Happen here is that that when I drag the slider button it fires a remote event, it should update the the value, but thats just not happening, unless I enable the lines that have been commented out in the data store script. It’s also not saving even though in the output in says it has saved the data. Like when I join the value just resets back to the default FOV

What am I doing wrong? Does DataStore2 not work in studio, even though I have the boolvalue in ServerStorage named “SaveInStudio” set to true.
Help would be much appreciated thanks.

10 comments

0

Just a couple of things to point out: Increment adds the original value to the value you provide, Set will replace the value (it seems like you'll want to use Set instead). The default value should only be used during the original :Get, no need to do it every time you want to add data to the datastore: FOVStore = DataStore2("FOVSave", Plr):Get(DefaultValue)

0

Also, you may want to avoid using value instances whenever possible. Instead you can just store the value in a variable, if you need to differentiate between players then use a table like this: numValue[playerName] = 5 just remember to clear out their playerName key when they leave or you'll have a memory leak.

0

If I store the value in a variable won't that make it so the value is unable to be changed in a different script? I'm kinda new to lua so not sure how that works, because when I join the game the X.Scale positon of the slider goes to = the value that I saved.

0

Thanks for the tips

0

now I am getting this error: "ServerScriptService.FOVDataSave:24: attempt to index number with 'Get'"

0

It goes away when I take of the :Get(DefaultValue) from "FOVStore = DataStore2("FOVSave", Plr):Get(DefaultValue)"

0

Try to change the name of the main key and try again (Caution though, this will "remove" all the saved data in the datastore), you may just have some slight desyncing is all. I have some code that looks exactly like this that works exactly as expected: CurrencyData = DataStore2("Currency", plr):GetTable(defaultCurrencyTable) The default value is a table, hence the :GetTable

0

As far as the variable instances, try to keep similar data consolidated into the same script. If you need to access the same data between scripts, then you can use Bindables or ModuleScripts to share the data. Both of these are A LOT better of an option rather than value instances.

0

Thanks man seems to be changing values and saving so far.

0

No problem bud! I also commented some tips for Datastore2 a while ago in AlvinBlox's video I think.