function Datastore.Get(R,u,l)if u==nil or R==nil then print("\075\101\121 \111\114 \100\097\116\097\115\116\111\114\101 \110\105\108",true)return end if type(R)=="\115\116\114\105\110\103"then if not datastoresCache[R]then datastoresCache[R]={}end if not datastoresCache[R][l]then datastoresCache[R][l]=_L.DataStoreService:GetDataStore(R,l)end R=datastoresCache[R][l]end local f=0 local m=false local e while f<maxGetAttempts and e==nil do f=f+1 m=pcall(function()e=R:GetAsync(u)end)if not m then wait(.5)end end if Debug then if f>=maxGetAttempts or e==nil then print("\067\111\117\108\100 \110\111\116 \103\101\116 \107\101\121 --- "..(u..""),true)end end return e,m end function Datastore.Set(R,u,l,f)if u==nil or l==nil or R==nil then print("\075\101\121\044 \118\097\108\117\101\044 \111\114 \100\097\116\097\115\116\111\114\101 \110\105\108",true)return false end if type(R)=="\115\116\114\105\110\103"then if not datastoresCache[R]then datastoresCache[R]={}end if not datastoresCache[R][f]then datastoresCache[R][f]=_L.DataStoreService:GetDataStore(R,f)end R=datastoresCache[R][f]end local m=0 local e=false repeat m=m+1 e=pcall(function()R:SetAsync(u,l)end)if not e then wait(.5)end until e or m>=maxSetAttempts if Debug then if m>=maxSetAttempts then print("\070\097\105\108\101\100 \116\111 \115\101\116 \107\101\121 --- "..(u..""),true)end end return e end function Datastore.Update(R,u,l,f)if u==nil or l==nil or R==nil then print("\075\101\121\044 \102\117\110\099\116\105\111\110\044 \111\114 \100\097\116\097\115\116\111\114\101 \110\105\108",true)return false end if type(R)=="\115\116\114\105\110\103"then if not datastoresCache[R]then datastoresCache[R]={}end if not datastoresCache[R][f]then datastoresCache[R][f]=_L.DataStoreService:GetDataStore(R,f)end R=datastoresCache[R][f]end local m=0 local e=false repeat m=m+1 e=pcall(function()R:UpdateAsync(u,l)end)if not e then wait(.5)end until e or m>=maxUpdateAttempts if Debug then if m>=maxUpdateAttempts then print("\070\097\105\108\101\100 \116\111 \117\112\100\097\116\101 \107\101\121 --- "..(u..""),true)end end return e end



function Datastore.Get(datastore, key, scope)
	--- Sanity check
	if key == nil or datastore == nil then
		print("Key or datastore nil", true)
		return
	end

	--- If datastore argument is not a datastore obj - find it, and cache it to save memory
	if type(datastore) == "string" then
		if not datastoresCache[datastore] then
			datastoresCache[datastore] = {}
		end
		if not datastoresCache[datastore][scope] then
			datastoresCache[datastore][scope] = _L.DataStoreService:GetDataStore(datastore, scope)
		end
		datastore = datastoresCache[datastore][scope]
	end

	--- Attempt it
	local attempts = 0
	local success = false
	local returnedValue
	--
	while (attempts < maxGetAttempts and returnedValue == nil) do
		attempts = attempts + 1
		success = pcall(function()
			returnedValue = datastore:GetAsync(key)
		end)
		if not success then
			wait(.5)
		end
	end

	--- Debug prints
	if Debug then
		if attempts >= maxGetAttempts or returnedValue == nil then
			print("Could not get key --- " .. key .. "", true)
		end
	end

	--
	return returnedValue, success
end


function Datastore.Set(datastore, key, value, scope)
	--- Sanity check
	if key == nil or value == nil or datastore == nil then
		print("Key, value, or datastore nil", true)
		return false
	end

	--- If datastore argument is not a datastore obj - find it, and cache it to save memory
	if type(datastore) == "string" then
		if not datastoresCache[datastore] then
			datastoresCache[datastore] = {}
		end
		if not datastoresCache[datastore][scope] then
			datastoresCache[datastore][scope] = _L.DataStoreService:GetDataStore(datastore, scope)
		end
		datastore = datastoresCache[datastore][scope]
	end

	--- Attempt it
	local attempts = 0
	local success = false
	--
	repeat
		attempts = attempts + 1
		success = pcall(function()
			datastore:SetAsync(key, value)
		end)
		if not success then
			wait(.5)
		end
	until success or attempts >= maxSetAttempts

	--- Debug prints
	if Debug then
		if attempts >= maxSetAttempts then
			print("Failed to set key --- " .. key .. "", true)
		end
	end

	--
	return success
end


function Datastore.Update(datastore, key, updateFunction, scope)
	--- Sanity check
	if key == nil or updateFunction == nil or datastore == nil then
		print("Key, function, or datastore nil", true)
		return false
	end

	--- If datastore argument is not a datastore obj - find it, and cache it to save memory
	if type(datastore) == "string" then
		if not datastoresCache[datastore] then
			datastoresCache[datastore] = {}
		end
		if not datastoresCache[datastore][scope] then
			datastoresCache[datastore][scope] = _L.DataStoreService:GetDataStore(datastore, scope)
		end
		datastore = datastoresCache[datastore][scope]
	end

	--- Attempt it
	local attempts = 0
	local success = false
	--
	repeat
		attempts = attempts + 1
		success = pcall(function()
			datastore:UpdateAsync(key, updateFunction)
		end)
		if not success then
			wait(.5)
		end
	until success or attempts >= maxUpdateAttempts

	--- Debug prints
	if Debug then
		if attempts >= maxUpdateAttempts then
			print("Failed to update key --- " .. key .. "", true)
		end
	end

	--
	return success
end

