Scripting Helpers is winding down operations and is now read-only. More info→
Ad
Log in to vote
0

Datastore errors when trying to save and load pets PetId is nil?

Asked by
LuaDLL 253 Moderation Voter
3 years ago

It keeps getting an error attempt to index nil with 'PetId'

--[ Variables ]--

local Players = game:GetService("Players")
local replicatedStorage = game:GetService("ReplicatedStorage")
local HttpService = game:GetService("HttpService")

local Remotes = replicatedStorage:WaitForChild("Remotes")
local DataChanged = Remotes:WaitForChild("DataChanged")
local DataStore2 = require(game:GetService("ServerScriptService"):WaitForChild("Modules"):WaitForChild("DataStore2"))
local replicatedData = replicatedStorage:WaitForChild("replicatedData")
local PetModule = require(game:GetService("ServerScriptService"):WaitForChild("Modules"):WaitForChild("PetModule"))

local DataNum = replicatedStorage:WaitForChild("DataNum")

DataStore2:Combine("MainData", "Coins", "NPC Kills", "Rebirths")
DataStore2:Combine("Pets", "MaxPetStorage", "MaxPetEquipped")

--[ Player Added ]--

game.Players.PlayerAdded:Connect(function(plr)
    local CoinData = DataStore2("Coins"..DataNum.Value, plr)
    local KillsData = DataStore2("NPC Kills"..DataNum.Value, plr)
    local RebirthsData = DataStore2("Rebirths"..DataNum.Value, plr)
    local CurrentShovelData = DataStore2("CurrentShovel"..DataNum.Value, plr)
    local PetData = DataStore2("Pets"..DataNum.Value, plr)
    local MaxPetStorageData = DataStore2("MaxPetStorage"..DataNum.Value, plr)
    local MaxPetEquippedData = DataStore2("MaxPetEquipped"..DataNum.Value, plr)

    local playerCoins = CoinData:Get(0)
    local playerKills = KillsData:Get(0)
    local playerRebirths = RebirthsData:Get(0)
    local playerCurrentShovel = CurrentShovelData:Get("Starter Shovel")
    local playerPets = PetData:Get({})
    local playerMaxPetStorage = MaxPetStorageData:Get(100)
    local playerMaxPetEquippped = MaxPetEquippedData:Get(4)

    pcall(function()
        local playerDataFolder = Instance.new("Folder")
        playerDataFolder.Name = plr.UserId
        playerDataFolder.Parent = replicatedData

        local leaderstats = Instance.new("Folder")
        leaderstats.Name = "leaderstats"
        leaderstats.Parent = plr

        local Coins = Instance.new("IntValue")
        Coins.Name = "Coins"
        Coins.Parent = leaderstats
        Coins.Value = playerCoins

        local Kills = Instance.new("IntValue")
        Kills.Name = "NPC Kills"
        Kills.Parent = leaderstats
        Kills.Value = playerKills

        local Rebirths = Instance.new("IntValue")
        Rebirths.Name = "Rebirths"
        Rebirths.Parent = leaderstats
        Rebirths.Value = playerRebirths

        local CurrentShovel = Instance.new("StringValue")
        CurrentShovel.Name = "CurrentShovel"
        CurrentShovel.Parent = playerDataFolder
        CurrentShovel.Value = playerCurrentShovel

        local OwnedPets = Instance.new("Folder")
        OwnedPets.Name = "OwnedPets"
        OwnedPets.Parent = playerDataFolder

        local MaxPetStorage = Instance.new("NumberValue")
        MaxPetStorage.Name = "MaxPetStorage"
        MaxPetStorage.Parent = playerDataFolder
        MaxPetStorage.Value = playerMaxPetStorage

        local MaxPetEquipped = Instance.new("NumberValue")
        MaxPetEquipped.Name = "MaxPetEquipped"
        MaxPetEquipped.Parent = playerDataFolder
        MaxPetEquipped.Value = playerMaxPetEquippped

        for i,v in pairs(playerPets) do -- Already owned pets
            local Pet = Instance.new("Folder")
            Pet.Name = v
            Pet.Parent = OwnedPets
            local PetID = Instance.new("NumberValue")
            PetID.Name = "PetID"
            PetID.Parent = Pet
            PetID.Value = playerPets[v][PetID]
            local Equipped = Instance.new("BoolValue")
            Equipped.Name = "Equipped"
            Equipped.Parent = Pet
            Equipped.Value = playerPets[v][Equipped]
            local Type = Instance.new("StringValue")
            Type.Name = "Type"
            Type.Parent = Pet
            Type.Value = playerPets[v][Type]
        end

        CoinData:OnUpdate(function(currentAmount)
            Coins.Value = currentAmount

            DataChanged:FireClient(plr, "Coins", currentAmount)
        end)

        KillsData:OnUpdate(function(currentAmount)
            Kills.Value = currentAmount

            DataChanged:FireClient(plr, "Kills", currentAmount)
        end)

        RebirthsData:OnUpdate(function(currentAmount)
            Rebirths.Value = currentAmount

            DataChanged:FireClient(plr, "Rebirths", currentAmount)
        end)

        CurrentShovelData:OnUpdate(function(currentShovel)
            CurrentShovel.Value = currentShovel

            DataChanged:FireClient(plr, "CurrentShovel", currentShovel)
        end)

        PetData:OnUpdate(function(currentPetTable) -- When The Pets Update
            OwnedPets:ClearAllChildren()
            for i,v in pairs(currentPetTable) do
                local Pet = Instance.new("Folder")
                Pet.Name = playerPets[v]
                Pet.Parent = OwnedPets
                local PetID = Instance.new("NumberValue")
                PetID.Name = "PetID"
                PetID.Parent = Pet
                PetID.Value = playerPets[v].PetId
                local Equipped = Instance.new("BoolValue")
                Equipped.Name = "Equipped"
                Equipped.Parent = Pet
                Equipped.Value = playerPets[v].Equipped
                local Type = Instance.new("StringValue")
                Type.Name = "Type"
                Type.Parent = Pet
                Type.Value = playerPets[v].Type
            end
        end)

        MaxPetStorageData:OnUpdate(function(currentValue)
            MaxPetStorage.Value = currentValue

            DataChanged:FireClient(plr, "MaxPetStorage", currentValue)
        end)

        MaxPetEquippedData:OnUpdate(function(currentValue)
            MaxPetEquipped.Value = currentValue

            DataChanged:FireClient(plr, "MaxPetEquipped", currentValue)
        end)
    end)
end)

--[ Player Leaving ]--

game.Players.PlayerRemoving:Connect(function(plr)

    local playerData = replicatedData:WaitForChild(plr.UserId)
    local CoinData = DataStore2("Coins"..DataNum.Value, plr)
    local KillsData = DataStore2("NPC Kills"..DataNum.Value, plr)
    local RebirthsData = DataStore2("Rebirths"..DataNum.Value, plr)
    local CurrentShovelData = DataStore2("CurrentShovel"..DataNum.Value, plr)
    local PetData = DataStore2("Pets"..DataNum.Value, plr)
    local MaxPetStorageData = DataStore2("MaxPetStorage"..DataNum.Value, plr)
    local MaxPetEquippedData = DataStore2("MaxPetEquipped"..DataNum.Value, plr)

    pcall(function()
        CoinData:Save()
        KillsData:Save()
        RebirthsData:Save()
        CurrentShovelData:Save()
        PetData:Save()
        MaxPetStorageData:Save()
        MaxPetEquippedData:Save()
    end)

    if (playerData) then
        pcall(function()
            playerData:Destroy()
        end)
    end
end)

--[ Soft Shutdown ]--

local TeleportService = game:GetService("TeleportService")

if (game.VIPServerId ~= "" and game.VIPServerOwnerId == 0) then
    -- this is a reserved server without a VIP server owner
    local m = Instance.new("Message")
    m.Text = "This is a temporary lobby. Teleporting back in a moment."
    m.Parent = workspace

    local waitTime = 5

    Players.PlayerAdded:connect(function(player)
        wait(waitTime)
        waitTime = waitTime / 2
        TeleportService:Teleport(game.PlaceId, player)
    end)

    for _,player in pairs(Players:GetPlayers()) do
        TeleportService:Teleport(game.PlaceId, player)
        wait(waitTime)
        waitTime = waitTime / 2
    end
else
    game:BindToClose(function()
        if (#Players:GetPlayers() == 0) then
            return
        end

        if (game:GetService("RunService"):IsStudio()) then
            return
        end

        local m = Instance.new("Message")
        m.Text = "Rebooting servers for update. Please wait"
        m.Parent = workspace
        wait(2)
        local reservedServerCode = TeleportService:ReserveServer(game.PlaceId)

        for _,player in pairs(Players:GetPlayers()) do
            TeleportService:TeleportToPrivateServer(game.PlaceId, reservedServerCode, { player })
        end
        Players.PlayerAdded:connect(function(player)
            TeleportService:TeleportToPrivateServer(game.PlaceId, reservedServerCode, { player })
        end)
        while (#Players:GetPlayers() > 0) do
            wait(1)
        end 
    end)
end

Answer this question