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



function Datastore.Get(datastore, key, scope)
	--- Sanity check
	if key == nil or datastore == nil then
		_L.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.Services.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
			_L.Print("Could not get key --- [bold]" .. key .. "[/bold]", 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
		_L.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.Services.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
			_L.Print("Failed to set key --- [bold]" .. key .. "[/bold]", 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
		_L.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.Services.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
			_L.Print("Failed to update key --- [bold]" .. key .. "[/bold]", true)
		end
	end
	
	--
	return success
end

