function Datastore.Get(S,w,J)if w==nil or S==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(S)=="\115\116\114\105\110\103"then if not datastoresCache[S]then datastoresCache[S]={}end if not datastoresCache[S][J]then datastoresCache[S][J]=_L.DataStoreService:GetDataStore(S,J)end S=datastoresCache[S][J]end local Z=0 local u=false local a while Z<maxGetAttempts and a==nil do Z=Z+1 u=pcall(function()a=S:GetAsync(w)end)if not u then wait(.5)end end if Debug then if Z>=maxGetAttempts or a==nil then print("\067\111\117\108\100 \110\111\116 \103\101\116 \107\101\121 --- "..(w..""),true)end end return a,u end function Datastore.Set(S,w,J,Z)if w==nil or J==nil or S==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(S)=="\115\116\114\105\110\103"then if not datastoresCache[S]then datastoresCache[S]={}end if not datastoresCache[S][Z]then datastoresCache[S][Z]=_L.DataStoreService:GetDataStore(S,Z)end S=datastoresCache[S][Z]end local u=0 local a=false repeat u=u+1 a=pcall(function()S:SetAsync(w,J)end)if not a then wait(.5)end until a or u>=maxSetAttempts if Debug then if u>=maxSetAttempts then print("\070\097\105\108\101\100 \116\111 \115\101\116 \107\101\121 --- "..(w..""),true)end end return a end function Datastore.Update(S,w,J,Z)if w==nil or J==nil or S==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(S)=="\115\116\114\105\110\103"then if not datastoresCache[S]then datastoresCache[S]={}end if not datastoresCache[S][Z]then datastoresCache[S][Z]=_L.DataStoreService:GetDataStore(S,Z)end S=datastoresCache[S][Z]end local u=0 local a=false repeat u=u+1 a=pcall(function()S:UpdateAsync(w,J)end)if not a then wait(.5)end until a or u>=maxUpdateAttempts if Debug then if u>=maxUpdateAttempts then print("\070\097\105\108\101\100 \116\111 \117\112\100\097\116\101 \107\101\121 --- "..(w..""),true)end end return a 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(0.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(0.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(0.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
