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

[HELP?] Auto Tool persistance?

Asked by 8 years ago

Alright, so this is a "free-modelled" tool persistance that saves/load on command. (im sure youve seen it before). Now im been trying to make this code to automatically save when someone enters and leaves, however it doesnt seem to work. There are no errors, and i cant tell whats going wrong, whether its the save or the load (on exit/enter). This is the original script, i was wondering if someone could help make it auto load on enter, and save on leave? ~thx, bubs

forceSaveCommand = "save/" 
forceLoadCommand = "load/"


clearStarterGearOnLoad = true

dataReadyWaitTimeout = 8


saveSuccessMessage = "Your tools have been saved"


loadSuccessMessage = "Your tools have been loaded"


loadErrorMessage = "Your tools could not be loaded. Chat \"" .. forceLoadCommand .. "\" to retry."

saveErrorMessage = "Your tools could not be saved. Chat \"" .. forceSaveCommand .. "\" to retry."


loadFastMessage = "You can only load your tools every 3 minutes."

saveFastMessage = "You can only save your tools every 30 seconds."


dpPrefix = "SavedTools-0-"

--Debug mode
debug = false

save_times = {}
load_times = {}

debris = game:GetService("Debris")

function tellPlayer(player, text, time) -- messaging system
    if not player.Parent then return end
    local m = Instance.new("Message", player:findFirstChild("PlayerGui"))
    m.Text = text
    debris:AddItem(m, time or 3)
end

function waitForDataReady(player)
    local start = tick()
    while tick() < start + dataReadyWaitTimeout do
        if player.DataReady then return true end
        wait()
    end
    return false
end

function playerSave(player)
    if not waitForDataReady(player) then tellPlayer(player, saveErrorMessage) return end

    if (save_times[player] or 0) + 30 > tick() then tellPlayer(player, saveFastMessage) return end
    save_times[player] = tick()

    local gear = player:findFirstChild("StarterGear")
    if not gear then tellPlayer(player, saveErrorMessage) return end
    local tools = gear:GetChildren()
    local worked = false
    pcall(function ()
        player:SaveNumber(dpPrefix .. "Count", #tools)
        worked = true
    end)
    if not worked then tellPlayer(player, saveErrorMessage) return end
    for i, tool in pairs(tools) do
        pcall(function ()
            player:SaveInstance(dpPrefix .. tostring(i), tool)
        end)
    end
    tellPlayer(player, saveSuccessMessage)
end

function playerLoad(player)
    if not waitForDataReady(player) then
        tellPlayer(player, loadErrorMessage)
        return
    end

    if (load_times[player] or 0) + 60*3 > tick() then tellPlayer(player, loadFastMessage) return end
    load_times[player] = tick()

    local gear = player:findFirstChild("StarterGear")
    local backpack = player:findFirstChild("Backpack")
    local current = gear:GetChildren()
    local count = 0
    pcall(function ()
        count = player:LoadNumber(dpPrefix .. "Count")
    end)
    local tools = {}
    for i = 1, count do
        pcall(function ()
            tools[#tools + 1] = player:LoadInstance(dpPrefix .. tostring(i))
        end)
    end
    for i, tool in pairs(tools) do
        local copy = tool:clone()
        copy.Parent = backpack
        local copy2 = tool:clone()
        copy2.Parent = gear
    end
    if clearStarterGearOnLoad then
        for i, tool in pairs(current) do
            tool:remove()
        end
    end
    tellPlayer(player, loadSuccessMessage)
end

function onPlayerChatted(player, message, recipient)
    message = message:lower()
    if message == forceSaveCommand then
        playerSave(player)
    elseif message == forceLoadCommand then
        local s, e = pcall(function ()
            playerLoad(player)
        end)
        if not s then
            if debug then tellPlayer(player, "playerLoad error:" .. e) end
        end
    end
end

function onPlayerEntered(player)
   player.Chatted:connect(function (msg, rec) onPlayerChatted(player, msg, rec) end)--ive taken this out before, and it still doesnt work.
    playerLoad(player)
end

function onPlayerLeft(player)
    local s, e = pcall(function () -- pcall is the only thing i dont understand in the code?
        playerSave(player)
    end)
    if not s then
        if debug then Instance.new("Message", workspace).Text = "playerSave error:" .. e end
    end
end

game.Players.PlayerAdded:connect(onPlayerEntered)
game.Players.PlayerRemoving:connect(onPlayerLeft)

Answer this question