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
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)
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.
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.
Thanks for the tips
now I am getting this error: "ServerScriptService.FOVDataSave:24: attempt to index number with 'Get'"
It goes away when I take of the :Get(DefaultValue) from "FOVStore = DataStore2("FOVSave", Plr):Get(DefaultValue)"
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
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.
Thanks man seems to be changing values and saving so far.
No problem bud! I also commented some tips for Datastore2 a while ago in AlvinBlox's video I think.