Here's the script:

local DataBaseStore = game:GetService("DataStoreService"):GetDataStore("AllTheStatsAreHere")
local Statsholder = script.Stats


game.Players.PlayerAdded:Connect(function(NewPlayer)

    local key = "Player-ID:" .. NewPlayer.UserId
    local GetSave = DataBaseStore:GetAsync(key)

    local DataBaseFolder = Instance.new("Folder", NewPlayer)
    DataBaseFolder.Name = "PlayerStats"

    for i, Stats in pairs(Statsholder:GetChildren()) do
        local NewStats = Instance.new(Stats.ClassName)
        NewStats.Name = Stats.Name
        NewStats.Value = Stats.Value
        NewStats.Parent = DataBaseFolder
    end

    if GetSave then

        for i, Stats in pairs(script.Stats:GetChildren()) do

            DataBaseFolder[Stats.Name].Value = GetSave[i]
            print(i, Stats.Name, Stats.Value)

            end

    else 

        local StatsToSave = {}

            for i, Stats in pairs(DataBaseFolder:GetChildren()) do

                table.insert(StatsToSave, Stats.Value)
                print(i, Stats.Name, Stats.Value)

            end

            DataBaseStore:SetAsync(key, StatsToSave)


        end

        while wait(15) do  

            local StatsToSave = {}

            for i, Stats in pairs(DataBaseFolder:GetChildren()) do

                table.insert(StatsToSave, Stats.Value)
                print(i, Stats.Name, Stats.Value)

            end

            DataBaseStore:SetAsync(key, StatsToSave)

        end

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


            local key = "Player-ID:" .. OldPlayer.UserId

            local StatsToSave = {}

            for i, Stats in pairs(DataBaseFolder:GetChildren()) do

                table.insert(StatsToSave, Stats.Value)
                print(i, Stats.Name, Stats.Value)

            end

            DataBaseStore:SetAsync(key, StatsToSave)

        end)


end)

It should technically save the data when the player is leaving the game yet it doesn't, i cannot figure out why, hope someone can help, thanks in advance.