Как я могу исправить данные в roblox - PullRequest
0 голосов
/ 27 апреля 2020

Я задал второй вопрос, потому что мой последний выходил из темы с комментариями. Поэтому я пытаюсь сделать так, чтобы roblox сохранял статистику игрока, но он всегда выставляет базовую c статистику. Даже если игрок уже играл. Вот мой код:

local HttpService = game:GetService("HttpService")
local DataStoreService = game:GetService("DataStoreService")
local ds = DataStoreService:GetDataStore("Data")

game.Players.PlayerAdded:Connect(function(player)
    local defaultData = {
        coins = 0,
        gems = 0,
        xp = 0,
        level = 1,
        maxstamina = 100,
        maxmagic = 100,
    }
    local loadedData = defaultData
    local success, result = pcall(function()
         return ds:GetAsync(player.UserId)
    end)
    if success then
        if result then
            -- if we've successfully loaded the data, parse the stored json data
            print(string.format("An old player named %s has returned with data : %s!", player.Name, tostring(result)))
            -- player data should look like this :
            -- {"coins":0,"xp":0,"gems":0,"level":1,"maxstamina":100,"maxmagic":100}
            local parseSuccess, parseResult = pcall(function()
                return HttpService:JSONDecode(result)
            end)
            if parseSuccess then
                loadedData = parseResult
            else
                warn(string.format("Failed to parse %s with error : %s", tostring(result), tostring(parseResult))) 
            end
        else
            -- we have a new player
            print(string.format("New player named %s has joined!", player.Name))
        end
    else
        warn(string.format("Something went wrong fetching %s's data : %s", player.Name, tostring(result)))
        -- TO DO: FIGURE OUT HOW YOU WANT TO HANDLE THIS ERROR.
        -- IF YOU DO NOTHING, THE PLAYER'S DATA WILL BE THE DEFAULT DATA USED FOR
        -- NEW PLAYERS
    end

    -- create the leaderstats and hidden values, load the data from the loadedData table
    local leaderstats = Instance.new("Model", player)
    leaderstats.Name = "leaderstats"

    local hidden = Instance.new("Model", player)
    hidden.Name = "hidden"

    local coins = Instance.new("IntValue", leaderstats)
    coins.Name = "Coins"
    coins.Value = loadedData.coins

    local gems = Instance.new("IntValue", leaderstats)
    gems.Name = "Gems"
    gems.Value = loadedData.gems

    local level = Instance.new("IntValue", leaderstats)
    level.Name = "Level"
    level.Value = loadedData.level

    local xp = Instance.new("IntValue", hidden)
    xp.Name = "XP"
    xp.Value = loadedData.xp

    local maxstamina = Instance.new("IntValue", hidden)
    maxstamina.Name = "MaxStamina"
    maxstamina.Value = loadedData.maxstamina

    local maxmagic = Instance.new("IntValue", hidden)
    maxmagic.Name = "MaxMagic"
    maxmagic.Value = loadedData.maxmagic

    local stamina = Instance.new("IntValue", hidden)
    stamina.Name = "Stamina"
    stamina.Value = loadedData.maxstamina

    local magic = Instance.new("IntValue", hidden)
    magic.Name = "Magic"
    magic.Value = loadedData.maxmagic
end)

game.Players.PlayerRemoving:Connect(function(player)
    local stats = player.leaderstats
    local hidden = player.hidden

    local data = {
        coins = stats.Coins.Value,
        gems = stats.Gems.Value,
        xp = hidden.XP.Value,
        level = stats.Level.Value,
        maxstamina = hidden.MaxStamina.Value,
        maxmagic = hidden.MaxMagic.Value,
    }

    -- wrap the request in a try-catch block to ensure that failures don't throw errors
    local success, result = pcall(function()
        -- save all the data as a JSON string
        ds:setAsync(player.UserId, HttpService:JSONEncode(data))
    end)
    if not success then
        warn(string.format("Failed to save %s's data with error : %s", player.Name, tostring(result)))
        -- TO DO: FIGURE OUT HOW YOU WANT TO HANDLE THIS ERROR.
        -- IF YOU DO NOTHING, THE PLAYER WILL LOSE THIS SESSION'S DATA
    end 
end)

Дополнительная информация:

Как вы можете мне помочь?

1 Ответ

0 голосов
/ 05 мая 2020

Я изменил свой ответ:

Итак, мы должны использовать DataStore2, и тогда он будет работать!

Вот хорошее руководство по DataStore2: https://www.youtube.com/watch?v=hBfMfB0BwGA

Вот мой окончательный код:

local DataStore2 = require(1936396537)

local defaultCoins = 0
local defaultGems = 0
local defaultLevel = 1
local defaultXP = 0
local defaultMStamina = 100
local defaultMMagic = 100

DataStore2.Combine("Data","coins","gems","level","xp","mstamina","mmagic")

local xpToLevelUp = function(level)
    return 100 + level * 5
end

game.Players.PlayerAdded:Connect(function(player)
    local coinsDataStore = DataStore2("coins",player)
    local gemsDataStore = DataStore2("gems",player)
    local levelDataStore = DataStore2("level",player)
    local xpDataStore = DataStore2("xp",player)
    local mstaminaDataStore = DataStore2("mstamina",player)
    local mmagicDataStore = DataStore2("mmagic",player)

    local stats = Instance.new("Folder",player)
    stats.Name = "stats"

    local coins = Instance.new("IntValue",stats)
    coins.Name = "Coins"

    local gems = Instance.new("IntValue",stats)
    gems.Name = "Gems"

    local level = Instance.new("IntValue",stats)
    level.Name = "Level"

    local xp = Instance.new("IntValue",stats)
    xp.Name = "XP"

    local mstamina = Instance.new("IntValue",stats)
    mstamina.Name = "MStamina"

    local stamina = Instance.new("IntValue",stats)
    stamina.Name = "Stamina"

    local mmagic = Instance.new("IntValue",stats)
    mmagic.Name = "MMagic"

    local magic = Instance.new("IntValue",stats)
    magic.Name = "Magic"

    local function coinsUpdate(updatedValue)
        coins.Value = coinsDataStore:Get(updatedValue)
    end
    local function gemsUpdate(updatedValue)
        gems.Value = gemsDataStore:Get(updatedValue)
    end
    local function levelUpdate(updatedValue)
        level.Value = levelDataStore:Get(updatedValue)
    end
    local function xpUpdate(updatedValue)
        if updatedValue >= xpToLevelUp(levelDataStore:Get(defaultLevel)) then
            xpDataStore:Increment(xpToLevelUp(levelDataStore:Get(defaultLevel)) * -1)
            levelDataStore:Increment(1)
        else
            player.stats.XP.Value = updatedValue
        end
    end
    local function mStaminaUpdate(updatedValue)
        mstamina.Value = mstaminaDataStore:Get(updatedValue)
    end
    local function mMagicUpdate(updatedValue)
        mmagic.Value = mmagicDataStore:Get(updatedValue)
    end

    coinsUpdate(defaultCoins)
    gemsUpdate(defaultGems)
    levelUpdate(defaultLevel)
    xpUpdate(defaultXP)
    mStaminaUpdate(defaultMStamina)
    mMagicUpdate(defaultMMagic)

    stamina.Value = mstamina.Value
    magic.Value = mmagic.Value

    coinsDataStore:OnUpdate(coinsUpdate)
    gemsDataStore:OnUpdate(gemsUpdate)
    levelDataStore:OnUpdate(levelUpdate)
    xpDataStore:OnUpdate(xpUpdate)
    mstaminaDataStore:OnUpdate(mStaminaUpdate)
    mmagicDataStore:OnUpdate(mMagicUpdate)
end)

game.ReplicatedStorage.Buy.OnServerEvent:Connect(function(player,cost,item)
    local coinsDataStore = DataStore2("coins",player)

    if player.leaderstats.Coins.Value < cost then
        game.ReplicatedStorage.NotEnoughCoins:FireClient(player)
    else
        coinsDataStore:Increment(cost * -1,defaultCoins)

        local buyedItem = game.ReplicatedStorage.Products:WaitForChild(item)
        local clonedItem = buyedItem:Clone()
        clonedItem.Parent = player.Backpack
    end
end)

game.ReplicatedStorage.EarnCoins.OnServerEvent:Connect(function(player,coins)
    local coinsDataStore = DataStore2("coins",player)

    coinsDataStore:Increment(coins,defaultCoins)
end)

game.ReplicatedStorage.EarnGems.OnServerEvent:Connect(function(player,gems)
    local gemsDataStore = DataStore2("gems",player)

    gemsDataStore:Increment(gems,defaultGems)
end)

game.ReplicatedStorage.Enchance.OnServerEvent:Connect(function(player,cost,item,enchancedItem)
    local gemsDataStore = DataStore2("gems",player)

    if player.leaderstats.Gems.Value < cost then
        game.ReplicatedStorage.NotEnoughGems:FireClient(player)
    else
        gemsDataStore:Increment(cost * -1,defaultGems)

        item:Destroy()
        local clonedItem = enchancedItem:Clone()
        clonedItem.Parent = player.Backpack
    end
end)

game.ReplicatedStorage.GainXP.OnServerEvent:Connect(function(player,amount)
    local xpDataStore = DataStore2("xp",player)

    xpDataStore:Increment(amount,defaultXP)
end)

game.ReplicatedStorage.LevelUp.OnServerEvent:Connect(function(player)
    local mstaminaDataStore = DataStore2("mstamina",player)
    local mmagicDataStore = DataStore2("mmagic",player)

    mstaminaDataStore:Increment(25,defaultMStamina)
    mmagicDataStore:Increment(25,defaultMMagic)
end)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...