Цель
Уменьшить риск потери прогресса
Подготовка
ServerScriptService → Script ProgressStorage; отдельный тестовый DataStore; не запускай его одновременно со скриптом урока 76.
Пошаговая работа
- Создай отдельную копию проекта для урока №77.
- ServerScriptService → Script ProgressStorage; отдельный тестовый DataStore; не запускай его одновременно со скриптом урока 76.
- Используй UpdateAsync и обработку сбоев
- Сохрани версию структуры данных
- Проверь выход игрока
- Запусти Play и проверь результат по контрольным условиям.
Пример Luau
local store = game:GetService("DataStoreService"):GetDataStore("ProgressLessonV2")
local function saveWins(userId, wins)
local key = tostring(userId)
local ok, err = pcall(function()
store:UpdateAsync(key, function(old)
local previous = type(old) == "table" and tonumber(old.wins) or 0
return {version = 2, wins = math.max(previous, wins)}
end)
end)
if not ok then warn("Не удалось сохранить прогресс:", err) end
return ok
end
-- Вызови saveWins(player.UserId, числоПобед) из своего
-- серверного менеджера прогресса после корректной загрузки данных.Проверка
Сохранение не падает без объяснения при ошибке
Повторная запись меньшего количества побед не уменьшает сохранённый максимум.
Ошибка и ограничения
SetAsync перезаписывает более новое значение. Это только функция записи, а не завершённая система сохранения; требуются загрузка, очередь записей и контроль одновременных сессий.
Усложнение
Добавь миграцию старого формата
Проверь пример в тестовой Roblox Studio перед публикацией. Используй отдельные копии проектов и не подключай два конкурирующих сохранения одновременно.
