Skip to main content

HasSaveSlots

Binds the save slot system to a live Player.

The slot model itself -- the roster, per-slot stores, selection, create/delete/reset, export/import, ephemeral slots and playtime -- lives in HasSaveSlotsDataStore, built here over the player's datastore. What stays behind is everything that only means something for a player in this server: replicating the slot container under them, the client remotes, teleport data, and summary providers (which are handed the Player).

Every slot method below is a straight delegation. Reach for HasSaveSlotsDataStore directly only when there is no player to bind -- admin tooling acting on someone who is not in this server.

Functions

GetSlotsDataStore

HasSaveSlots.GetSlotsDataStore(selfHasSaveSlots) → HasSaveSlotsDataStore

Returns the underlying player-independent slot system, a HasSaveSlotsDataStore. Prefer the delegating methods on this class; this is for code that needs to hand the slot system to something that does not know about players.

Typed any deliberately: naming HasSaveSlotsDataStore.HasSaveSlotsDataStore anywhere in this file -- even once -- pushes the old solver over its complexity budget ("Code is too complex"). The delegating methods below still carry their own precise return types, which is what callers read; require the module directly for a typed handle.

ObserveActiveSlotStoreBrio

HasSaveSlots.ObserveActiveSlotStoreBrio(selfHasSaveSlots) → Observable.Observable<Brio.Brio<DataStoreStage.DataStoreStage>>

Observes the DataStoreStage for the active slot as a Brio

PromiseActiveSlotStore

HasSaveSlots.PromiseActiveSlotStore(selfHasSaveSlots) → Promise.Promise<DataStoreStage.DataStoreStage?>

Returns the DataStoreStage for the active slot

PromiseSlotsLoaded

HasSaveSlots.PromiseSlotsLoaded(selfHasSaveSlots) → Promise.Promise<any>

Promises that all slots have loaded

PromiseHasSlot

HasSaveSlots.PromiseHasSlot(
selfHasSaveSlots,
slotIdSaveSlotData.SlotId?
) → Promise.Promise<boolean>

Returns whether the slot with the given ID exists

PromiseSelectSlot

HasSaveSlots.PromiseSelectSlot(
selfHasSaveSlots,
slotIdSaveSlotData.SlotId
) → Promise.Promise<any>

Selects the slot with the given ID

PromiseDeselectSlot

HasSaveSlots.PromiseDeselectSlot(selfHasSaveSlots) → Promise.Promise<()>

Clears the active slot selection, returning the player to a no-slot state -- the counterpart to HasSaveSlots.PromiseSelectSlot, backing a "back to menu" affordance. See HasSaveSlotsDataStore.PromiseDeselectSlot.

PromiseCreateSlot

HasSaveSlots.PromiseCreateSlot(
selfHasSaveSlots,
slotIndexnumber,
metadataSaveSlotCreateMetadata?
) → Promise.Promise<SaveSlotData.SlotId>

Creates a slot at the given index

PromiseExportSlot

HasSaveSlots.PromiseExportSlot(
selfHasSaveSlots,
slotIdSlotId,
allowMainSlotboolean?--

defaults to false

) → Promise<SaveSlotExportUtils.SaveSlotExport>

Exports a slot's saved data into a plain, serializable SaveSlotExportUtils.SaveSlotExport. Refuses the main slot unless allowMainSlot is set -- see HasSaveSlotsDataStore.PromiseExportSlot.

PromiseImportSlot

HasSaveSlots.PromiseImportSlot(
selfHasSaveSlots,
exportSaveSlotExportUtils.SaveSlotExport,
targetSlotIndexnumber?--

defaults to the lowest free non-main index

) → Promise<SlotId>

Imports an exported slot into a fresh slot, at the lowest free non-main index by default. See HasSaveSlotsDataStore.PromiseImportSlot.

PromiseSaveSlotToSharedDataStore

HasSaveSlots.PromiseSaveSlotToSharedDataStore(
selfHasSaveSlots,
slotIdSlotId,
keystring,
allowMainSlotboolean?--

defaults to false

) → Promise<boolean>

Exports a non-main slot and writes it to the shared save slot store under the given key. See HasSaveSlotsDataStore.PromiseSaveSlotToSharedDataStore.

PromiseImportSlotFromSharedDataStore

HasSaveSlots.PromiseImportSlotFromSharedDataStore(
selfHasSaveSlots,
keystring
) → Promise<SlotId>

Reads an export from the shared save slot store and imports it into a fresh non-main slot. See HasSaveSlotsDataStore.PromiseImportSlotFromSharedDataStore.

PromiseSelectTransferableEphemeralSlot

HasSaveSlots.PromiseSelectTransferableEphemeralSlot(
selfHasSaveSlots,
keystring
) → Promise<SlotId>

Resumes a transfer from the given shared-store key into a fresh ephemeral slot and selects it. Only entries written as transfers are accepted; a share code is redeemed through HasSaveSlots.PromiseImportEphemeralSaveSlotFromCode. See HasSaveSlotsDataStore.PromiseSelectTransferableEphemeralSlot.

PromiseBuildEphemeralTransferSlice

HasSaveSlots.PromiseBuildEphemeralTransferSlice(selfHasSaveSlots) → Promise<{[string]any}?>

Builds this player's teleport slice for a transferable ephemeral slot. See HasSaveSlotsDataStore.PromiseBuildEphemeralTransferSlice.

PromiseLoadTransferableEphemeralSlotFromTeleport

HasSaveSlots.PromiseLoadTransferableEphemeralSlotFromTeleport(selfHasSaveSlots) → Promise<SlotId?>

Selects the transferable ephemeral slot the player teleported in with, from the shared-store key in their arrived data. Reads the unified band (not trusted-only) so a client-initiated teleport -- the common case, e.g. a menu resume hop -- carries it too; a server-initiated teleport still works via the trusted band. Resolves to the slot id, or nil when none arrived.

Because the client band is honored, a client can present any key it knows -- which is why the entry behind it must have been written as a transfer (see SaveSlotExportUtils.Kind). A share code, the one key players deliberately pass around, is refused here, so redeeming one stays a decision the server makes in HasSaveSlots.PromiseImportEphemeralSaveSlotFromCode rather than something a teleport can do. A transfer key is itself replicated (see ActiveTransferableEphemeralKey) and only ever seeds a throwaway, never-persisted slot, so what it exposes is read-only visibility of that snapshot.

SetCodeGenerator

HasSaveSlots.SetCodeGenerator(
selfHasSaveSlots,
generatorCodeGenerator
) → ()

Overrides the share-code generator for this player's exports (see SaveSlotCodeUtils.CodeGenerator). Games inject a custom format; the default is SaveSlotCodeUtils.generateDefaultCode. Usually set game-wide via SaveSlotService.SetCodeGenerator rather than per player.

PromiseExportSaveSlotToCode

HasSaveSlots.PromiseExportSaveSlotToCode(
selfHasSaveSlots,
slotIdSlotId?,--

defaults to the active slot

allowMainSlotboolean?--

defaults to false

) → Promise<string>

Exports a slot to the shared store under a fresh generated code and resolves to that code. See HasSaveSlotsDataStore.PromiseExportSaveSlotToCode.

PromiseImportEphemeralSaveSlotFromCode

HasSaveSlots.PromiseImportEphemeralSaveSlotFromCode(
selfHasSaveSlots,
codestring
) → Promise<SlotId>

Redeems a share code into a fresh transferable ephemeral slot and selects it. The slot transfers onward under a freshly minted key, never the code itself. See HasSaveSlotsDataStore.PromiseImportEphemeralSaveSlotFromCode.

PromiseExportSaveSlotToJson

HasSaveSlots.PromiseExportSaveSlotToJson(
selfHasSaveSlots,
slotIdSlotId?,--

defaults to the active slot

allowMainSlotboolean?--

defaults to false

) → Promise<string>

Exports a slot as a raw JSON string (no shared store). See HasSaveSlotsDataStore.PromiseExportSaveSlotToJson.

PromiseDuplicateSlot

HasSaveSlots.PromiseDuplicateSlot(
selfHasSaveSlots,
slotIdSaveSlotData.SlotId
) → Promise.Promise<SaveSlotData.SlotId>

Duplicates the slot with the given ID into a new slot at the lowest free index, copying its saved data and accrued playtime. See HasSaveSlotsDataStore.PromiseDuplicateSlot.

PromisePersistEphemeralSlot

HasSaveSlots.PromisePersistEphemeralSlot(
selfHasSaveSlots,
slotIdSlotId?--

defaults to the active slot

) → Promise<SlotId>

Turns an ephemeral slot into a real save and selects it. See HasSaveSlotsDataStore.PromisePersistEphemeralSlot.

PromiseDeleteSlot

HasSaveSlots.PromiseDeleteSlot(
selfHasSaveSlots,
slotIdSaveSlotData.SlotId
) → Promise.Promise<any>

Deletes the slot with the given ID. See HasSaveSlotsDataStore.PromiseDeleteSlot.

PromiseDeleteAllSlots

HasSaveSlots.PromiseDeleteAllSlots(selfHasSaveSlots) → Promise.Promise<any>

Deletes every slot for the player and clears the active/last-active selection, resetting the player to a fresh state. Resolves once all slots are gone.

PromiseResetSlot

HasSaveSlots.PromiseResetSlot(
selfHasSaveSlots,
slotIdSaveSlotData.SlotId
) → Promise.Promise<SaveSlotData.SlotId>

Resets the slot with the given id to a fresh empty one. See HasSaveSlotsDataStore.PromiseResetSlot.

PromiseResetActiveSlot

HasSaveSlots.PromiseResetActiveSlot(selfHasSaveSlots) → Promise.Promise<SaveSlotData.SlotId?>

Resets the active slot to a fresh empty one -- see HasSaveSlots.PromiseResetSlot. Resolves to the new slot id, or nil when no slot is active.

PromiseSetSlotMetadata

HasSaveSlots.PromiseSetSlotMetadata(
selfHasSaveSlots,
slotIdSaveSlotData.SlotId,
dataSaveSlotData.SaveSlotMetadata
) → Promise.Promise<any>

Sets the metadata for the slot with the given ID

PromiseGetSlotMetadata

HasSaveSlots.PromiseGetSlotMetadata(
selfHasSaveSlots,
slotIdSaveSlotData.SlotId
) → Promise.Promise<SaveSlotData.SaveSlotMetadata?>

Gets the metadata for the slot with the given ID

PromiseSlotIdFromIndex

HasSaveSlots.PromiseSlotIdFromIndex(
selfHasSaveSlots,
slotIndexnumber
) → Promise.Promise<SaveSlotData.SlotId?>

Returns the slot ID from the given index

PromiseLastActiveSlotId

HasSaveSlots.PromiseLastActiveSlotId(selfHasSaveSlots) → Promise.Promise<SaveSlotData.SlotId?>

Gets the last active slot ID

PromiseSelectLastSaveSlot

HasSaveSlots.PromiseSelectLastSaveSlot(selfHasSaveSlots) → Promise.Promise<SaveSlotData.SlotId?>

Selects the player's last active slot if one still exists, resolving to the selected slot id -- or nil when there is no slot to continue on. Backs a "Continue" affordance that every save-slot consumer tends to need.

PromiseSelectNewSaveSlot

HasSaveSlots.PromiseSelectNewSaveSlot(selfHasSaveSlots) → Promise.Promise<SaveSlotData.SlotId?>

Creates a new slot at the lowest free index and selects it, resolving to the new slot id -- or nil when every slot is already in use. Backs a "New Game" affordance.

PromiseSelectEphemeralSlot

HasSaveSlots.PromiseSelectEphemeralSlot(
selfHasSaveSlots,
metadataSaveSlotCreateMetadata?--

optional SlotName/Summary for the in-memory slot

) → Promise<SlotId>

Creates a fresh ephemeral slot and selects it, resolving to its id. See HasSaveSlotsDataStore.PromiseSelectEphemeralSlot.

RegisterSummaryProvider

HasSaveSlots.RegisterSummaryProvider(
selfHasSaveSlots,
namestring,
providerSummaryProvider
) → () → ()

Registers a named summary provider. Every registered provider's current value is aggregated into the active slot's Summary, keyed by name (see HasSaveSlots.PromiseGetSlotMetadata). Registering the same name again replaces the previous provider. Returns a function that unregisters the provider (also give it to a [Maid]).

Show raw api
{
    "functions": [
        {
            "name": "GetSlotsDataStore",
            "desc": "Returns the underlying player-independent slot system, a [HasSaveSlotsDataStore]. Prefer the\ndelegating methods on this class; this is for code that needs to hand the slot system to something\nthat does not know about players.\n\nTyped `any` deliberately: naming `HasSaveSlotsDataStore.HasSaveSlotsDataStore` anywhere in this\nfile -- even once -- pushes the old solver over its complexity budget (\"Code is too complex\"). The\ndelegating methods below still carry their own precise return types, which is what callers read;\nrequire the module directly for a typed handle.",
            "params": [
                {
                    "name": "self",
                    "desc": "",
                    "lua_type": "HasSaveSlots"
                }
            ],
            "returns": [
                {
                    "desc": "",
                    "lua_type": "HasSaveSlotsDataStore"
                }
            ],
            "function_type": "static",
            "source": {
                "line": 158,
                "path": "src/saveslot/src/Server/Binders/HasSaveSlots.lua"
            }
        },
        {
            "name": "ObserveActiveSlotStoreBrio",
            "desc": "Observes the [DataStoreStage] for the active slot as a [Brio]",
            "params": [
                {
                    "name": "self",
                    "desc": "",
                    "lua_type": "HasSaveSlots\n"
                }
            ],
            "returns": [
                {
                    "desc": "",
                    "lua_type": "Observable.Observable<Brio.Brio<DataStoreStage.DataStoreStage>>\n"
                }
            ],
            "function_type": "static",
            "source": {
                "line": 165,
                "path": "src/saveslot/src/Server/Binders/HasSaveSlots.lua"
            }
        },
        {
            "name": "PromiseActiveSlotStore",
            "desc": "Returns the [DataStoreStage] for the active slot",
            "params": [
                {
                    "name": "self",
                    "desc": "",
                    "lua_type": "HasSaveSlots"
                }
            ],
            "returns": [
                {
                    "desc": "",
                    "lua_type": "Promise.Promise<DataStoreStage.DataStoreStage?>\n"
                }
            ],
            "function_type": "static",
            "source": {
                "line": 174,
                "path": "src/saveslot/src/Server/Binders/HasSaveSlots.lua"
            }
        },
        {
            "name": "PromiseSlotsLoaded",
            "desc": "Promises that all slots have loaded",
            "params": [
                {
                    "name": "self",
                    "desc": "",
                    "lua_type": "HasSaveSlots"
                }
            ],
            "returns": [
                {
                    "desc": "",
                    "lua_type": "Promise.Promise<any>\n"
                }
            ],
            "function_type": "static",
            "source": {
                "line": 181,
                "path": "src/saveslot/src/Server/Binders/HasSaveSlots.lua"
            }
        },
        {
            "name": "PromiseHasSlot",
            "desc": "Returns whether the slot with the given ID exists",
            "params": [
                {
                    "name": "self",
                    "desc": "",
                    "lua_type": "HasSaveSlots"
                },
                {
                    "name": "slotId",
                    "desc": "",
                    "lua_type": "SaveSlotData.SlotId?"
                }
            ],
            "returns": [
                {
                    "desc": "",
                    "lua_type": "Promise.Promise<boolean>\n"
                }
            ],
            "function_type": "static",
            "source": {
                "line": 188,
                "path": "src/saveslot/src/Server/Binders/HasSaveSlots.lua"
            }
        },
        {
            "name": "PromiseSelectSlot",
            "desc": "Selects the slot with the given ID",
            "params": [
                {
                    "name": "self",
                    "desc": "",
                    "lua_type": "HasSaveSlots"
                },
                {
                    "name": "slotId",
                    "desc": "",
                    "lua_type": "SaveSlotData.SlotId"
                }
            ],
            "returns": [
                {
                    "desc": "",
                    "lua_type": "Promise.Promise<any>\n"
                }
            ],
            "function_type": "static",
            "source": {
                "line": 211,
                "path": "src/saveslot/src/Server/Binders/HasSaveSlots.lua"
            }
        },
        {
            "name": "PromiseDeselectSlot",
            "desc": "Clears the active slot selection, returning the player to a no-slot state --\nthe counterpart to [HasSaveSlots.PromiseSelectSlot], backing a \"back to menu\"\naffordance. See [HasSaveSlotsDataStore.PromiseDeselectSlot].",
            "params": [
                {
                    "name": "self",
                    "desc": "",
                    "lua_type": "HasSaveSlots"
                }
            ],
            "returns": [
                {
                    "desc": "",
                    "lua_type": "Promise.Promise<()>\n"
                }
            ],
            "function_type": "static",
            "source": {
                "line": 220,
                "path": "src/saveslot/src/Server/Binders/HasSaveSlots.lua"
            }
        },
        {
            "name": "PromiseCreateSlot",
            "desc": "Creates a slot at the given index",
            "params": [
                {
                    "name": "self",
                    "desc": "",
                    "lua_type": "HasSaveSlots"
                },
                {
                    "name": "slotIndex",
                    "desc": "",
                    "lua_type": "number"
                },
                {
                    "name": "metadata",
                    "desc": "",
                    "lua_type": "SaveSlotCreateMetadata?\n"
                }
            ],
            "returns": [
                {
                    "desc": "",
                    "lua_type": "Promise.Promise<SaveSlotData.SlotId>\n"
                }
            ],
            "function_type": "static",
            "source": {
                "line": 227,
                "path": "src/saveslot/src/Server/Binders/HasSaveSlots.lua"
            }
        },
        {
            "name": "PromiseExportSlot",
            "desc": "Exports a slot's saved data into a plain, serializable [SaveSlotExportUtils.SaveSlotExport]. Refuses\nthe main slot unless `allowMainSlot` is set -- see [HasSaveSlotsDataStore.PromiseExportSlot].",
            "params": [
                {
                    "name": "self",
                    "desc": "",
                    "lua_type": "HasSaveSlots"
                },
                {
                    "name": "slotId",
                    "desc": "",
                    "lua_type": "SlotId"
                },
                {
                    "name": "allowMainSlot",
                    "desc": "defaults to false",
                    "lua_type": "boolean?"
                }
            ],
            "returns": [
                {
                    "desc": "",
                    "lua_type": "Promise<SaveSlotExportUtils.SaveSlotExport>"
                }
            ],
            "function_type": "static",
            "source": {
                "line": 243,
                "path": "src/saveslot/src/Server/Binders/HasSaveSlots.lua"
            }
        },
        {
            "name": "PromiseImportSlot",
            "desc": "Imports an exported slot into a fresh slot, at the lowest free non-main index by default. See\n[HasSaveSlotsDataStore.PromiseImportSlot].",
            "params": [
                {
                    "name": "self",
                    "desc": "",
                    "lua_type": "HasSaveSlots"
                },
                {
                    "name": "export",
                    "desc": "",
                    "lua_type": "SaveSlotExportUtils.SaveSlotExport"
                },
                {
                    "name": "targetSlotIndex",
                    "desc": "defaults to the lowest free non-main index",
                    "lua_type": "number?"
                }
            ],
            "returns": [
                {
                    "desc": "",
                    "lua_type": "Promise<SlotId>"
                }
            ],
            "function_type": "static",
            "source": {
                "line": 259,
                "path": "src/saveslot/src/Server/Binders/HasSaveSlots.lua"
            }
        },
        {
            "name": "PromiseSaveSlotToSharedDataStore",
            "desc": "Exports a non-main slot and writes it to the shared save slot store under the given key. See\n[HasSaveSlotsDataStore.PromiseSaveSlotToSharedDataStore].",
            "params": [
                {
                    "name": "self",
                    "desc": "",
                    "lua_type": "HasSaveSlots"
                },
                {
                    "name": "slotId",
                    "desc": "",
                    "lua_type": "SlotId"
                },
                {
                    "name": "key",
                    "desc": "",
                    "lua_type": "string"
                },
                {
                    "name": "allowMainSlot",
                    "desc": "defaults to false",
                    "lua_type": "boolean?"
                }
            ],
            "returns": [
                {
                    "desc": "",
                    "lua_type": "Promise<boolean>"
                }
            ],
            "function_type": "static",
            "source": {
                "line": 276,
                "path": "src/saveslot/src/Server/Binders/HasSaveSlots.lua"
            }
        },
        {
            "name": "PromiseImportSlotFromSharedDataStore",
            "desc": "Reads an export from the shared save slot store and imports it into a fresh non-main slot. See\n[HasSaveSlotsDataStore.PromiseImportSlotFromSharedDataStore].",
            "params": [
                {
                    "name": "self",
                    "desc": "",
                    "lua_type": "HasSaveSlots"
                },
                {
                    "name": "key",
                    "desc": "",
                    "lua_type": "string"
                }
            ],
            "returns": [
                {
                    "desc": "",
                    "lua_type": "Promise<SlotId>"
                }
            ],
            "function_type": "static",
            "source": {
                "line": 292,
                "path": "src/saveslot/src/Server/Binders/HasSaveSlots.lua"
            }
        },
        {
            "name": "PromiseSelectTransferableEphemeralSlot",
            "desc": "Resumes a transfer from the given shared-store key into a fresh ephemeral slot and selects it. Only\nentries written as transfers are accepted; a share code is redeemed through\n[HasSaveSlots.PromiseImportEphemeralSaveSlotFromCode]. See\n[HasSaveSlotsDataStore.PromiseSelectTransferableEphemeralSlot].",
            "params": [
                {
                    "name": "self",
                    "desc": "",
                    "lua_type": "HasSaveSlots"
                },
                {
                    "name": "key",
                    "desc": "",
                    "lua_type": "string"
                }
            ],
            "returns": [
                {
                    "desc": "",
                    "lua_type": "Promise<SlotId>"
                }
            ],
            "function_type": "static",
            "source": {
                "line": 308,
                "path": "src/saveslot/src/Server/Binders/HasSaveSlots.lua"
            }
        },
        {
            "name": "PromiseBuildEphemeralTransferSlice",
            "desc": "Builds this player's teleport slice for a transferable ephemeral slot. See\n[HasSaveSlotsDataStore.PromiseBuildEphemeralTransferSlice].",
            "params": [
                {
                    "name": "self",
                    "desc": "",
                    "lua_type": "HasSaveSlots"
                }
            ],
            "returns": [
                {
                    "desc": "",
                    "lua_type": "Promise<{ [string]: any }?>"
                }
            ],
            "function_type": "static",
            "source": {
                "line": 321,
                "path": "src/saveslot/src/Server/Binders/HasSaveSlots.lua"
            }
        },
        {
            "name": "PromiseLoadTransferableEphemeralSlotFromTeleport",
            "desc": "Selects the transferable ephemeral slot the player teleported in with, from the shared-store key in\ntheir arrived data. Reads the *unified* band (not trusted-only) so a **client-initiated** teleport --\nthe common case, e.g. a menu resume hop -- carries it too; a server-initiated teleport still works via\nthe trusted band. Resolves to the slot id, or nil when none arrived.\n\nBecause the client band is honored, a client can present any key it knows -- which is why the entry\nbehind it must have been written as a transfer (see [SaveSlotExportUtils.Kind]). A share code, the one\nkey players deliberately pass around, is refused here, so redeeming one stays a decision the server\nmakes in [HasSaveSlots.PromiseImportEphemeralSaveSlotFromCode] rather than something a teleport can do.\nA transfer key is itself replicated (see `ActiveTransferableEphemeralKey`) and only ever seeds a\nthrowaway, never-persisted slot, so what it exposes is read-only visibility of that snapshot.",
            "params": [
                {
                    "name": "self",
                    "desc": "",
                    "lua_type": "HasSaveSlots\n"
                }
            ],
            "returns": [
                {
                    "desc": "",
                    "lua_type": "Promise<SlotId?>"
                }
            ],
            "function_type": "static",
            "source": {
                "line": 340,
                "path": "src/saveslot/src/Server/Binders/HasSaveSlots.lua"
            }
        },
        {
            "name": "SetCodeGenerator",
            "desc": "Overrides the share-code generator for this player's exports (see [SaveSlotCodeUtils.CodeGenerator]).\nGames inject a custom format; the default is [SaveSlotCodeUtils.generateDefaultCode]. Usually set\ngame-wide via [SaveSlotService.SetCodeGenerator] rather than per player.",
            "params": [
                {
                    "name": "self",
                    "desc": "",
                    "lua_type": "HasSaveSlots"
                },
                {
                    "name": "generator",
                    "desc": "",
                    "lua_type": "CodeGenerator"
                }
            ],
            "returns": [],
            "function_type": "static",
            "source": {
                "line": 360,
                "path": "src/saveslot/src/Server/Binders/HasSaveSlots.lua"
            }
        },
        {
            "name": "PromiseExportSaveSlotToCode",
            "desc": "Exports a slot to the shared store under a fresh generated code and resolves to that code. See\n[HasSaveSlotsDataStore.PromiseExportSaveSlotToCode].",
            "params": [
                {
                    "name": "self",
                    "desc": "",
                    "lua_type": "HasSaveSlots"
                },
                {
                    "name": "slotId",
                    "desc": "defaults to the active slot",
                    "lua_type": "SlotId?"
                },
                {
                    "name": "allowMainSlot",
                    "desc": "defaults to false",
                    "lua_type": "boolean?"
                }
            ],
            "returns": [
                {
                    "desc": "",
                    "lua_type": "Promise<string>"
                }
            ],
            "function_type": "static",
            "source": {
                "line": 372,
                "path": "src/saveslot/src/Server/Binders/HasSaveSlots.lua"
            }
        },
        {
            "name": "PromiseImportEphemeralSaveSlotFromCode",
            "desc": "Redeems a share code into a fresh transferable ephemeral slot and selects it. The slot transfers\nonward under a freshly minted key, never the code itself. See\n[HasSaveSlotsDataStore.PromiseImportEphemeralSaveSlotFromCode].",
            "params": [
                {
                    "name": "self",
                    "desc": "",
                    "lua_type": "HasSaveSlots"
                },
                {
                    "name": "code",
                    "desc": "",
                    "lua_type": "string"
                }
            ],
            "returns": [
                {
                    "desc": "",
                    "lua_type": "Promise<SlotId>"
                }
            ],
            "function_type": "static",
            "source": {
                "line": 388,
                "path": "src/saveslot/src/Server/Binders/HasSaveSlots.lua"
            }
        },
        {
            "name": "PromiseExportSaveSlotToJson",
            "desc": "Exports a slot as a raw JSON string (no shared store). See\n[HasSaveSlotsDataStore.PromiseExportSaveSlotToJson].",
            "params": [
                {
                    "name": "self",
                    "desc": "",
                    "lua_type": "HasSaveSlots"
                },
                {
                    "name": "slotId",
                    "desc": "defaults to the active slot",
                    "lua_type": "SlotId?"
                },
                {
                    "name": "allowMainSlot",
                    "desc": "defaults to false",
                    "lua_type": "boolean?"
                }
            ],
            "returns": [
                {
                    "desc": "",
                    "lua_type": "Promise<string>"
                }
            ],
            "function_type": "static",
            "source": {
                "line": 403,
                "path": "src/saveslot/src/Server/Binders/HasSaveSlots.lua"
            }
        },
        {
            "name": "PromiseDuplicateSlot",
            "desc": "Duplicates the slot with the given ID into a new slot at the lowest free index, copying its saved\ndata and accrued playtime. See [HasSaveSlotsDataStore.PromiseDuplicateSlot].",
            "params": [
                {
                    "name": "self",
                    "desc": "",
                    "lua_type": "HasSaveSlots"
                },
                {
                    "name": "slotId",
                    "desc": "",
                    "lua_type": "SaveSlotData.SlotId\n"
                }
            ],
            "returns": [
                {
                    "desc": "",
                    "lua_type": "Promise.Promise<SaveSlotData.SlotId>\n"
                }
            ],
            "function_type": "static",
            "source": {
                "line": 415,
                "path": "src/saveslot/src/Server/Binders/HasSaveSlots.lua"
            }
        },
        {
            "name": "PromisePersistEphemeralSlot",
            "desc": "Turns an ephemeral slot into a real save and selects it. See\n[HasSaveSlotsDataStore.PromisePersistEphemeralSlot].",
            "params": [
                {
                    "name": "self",
                    "desc": "",
                    "lua_type": "HasSaveSlots"
                },
                {
                    "name": "slotId",
                    "desc": "defaults to the active slot",
                    "lua_type": "SlotId?"
                }
            ],
            "returns": [
                {
                    "desc": "",
                    "lua_type": "Promise<SlotId>"
                }
            ],
            "function_type": "static",
            "source": {
                "line": 429,
                "path": "src/saveslot/src/Server/Binders/HasSaveSlots.lua"
            }
        },
        {
            "name": "PromiseDeleteSlot",
            "desc": "Deletes the slot with the given ID. See [HasSaveSlotsDataStore.PromiseDeleteSlot].",
            "params": [
                {
                    "name": "self",
                    "desc": "",
                    "lua_type": "HasSaveSlots"
                },
                {
                    "name": "slotId",
                    "desc": "",
                    "lua_type": "SaveSlotData.SlotId"
                }
            ],
            "returns": [
                {
                    "desc": "",
                    "lua_type": "Promise.Promise<any>\n"
                }
            ],
            "function_type": "static",
            "source": {
                "line": 439,
                "path": "src/saveslot/src/Server/Binders/HasSaveSlots.lua"
            }
        },
        {
            "name": "PromiseDeleteAllSlots",
            "desc": "Deletes every slot for the player and clears the active/last-active\nselection, resetting the player to a fresh state. Resolves once all slots\nare gone.",
            "params": [
                {
                    "name": "self",
                    "desc": "",
                    "lua_type": "HasSaveSlots"
                }
            ],
            "returns": [
                {
                    "desc": "",
                    "lua_type": "Promise.Promise<any>\n"
                }
            ],
            "function_type": "static",
            "source": {
                "line": 448,
                "path": "src/saveslot/src/Server/Binders/HasSaveSlots.lua"
            }
        },
        {
            "name": "PromiseResetSlot",
            "desc": "Resets the slot with the given id to a fresh empty one. See [HasSaveSlotsDataStore.PromiseResetSlot].",
            "params": [
                {
                    "name": "self",
                    "desc": "",
                    "lua_type": "HasSaveSlots"
                },
                {
                    "name": "slotId",
                    "desc": "",
                    "lua_type": "SaveSlotData.SlotId\n"
                }
            ],
            "returns": [
                {
                    "desc": "",
                    "lua_type": "Promise.Promise<SaveSlotData.SlotId>\n"
                }
            ],
            "function_type": "static",
            "source": {
                "line": 455,
                "path": "src/saveslot/src/Server/Binders/HasSaveSlots.lua"
            }
        },
        {
            "name": "PromiseResetActiveSlot",
            "desc": "Resets the active slot to a fresh empty one -- see [HasSaveSlots.PromiseResetSlot]. Resolves to the\nnew slot id, or nil when no slot is active.",
            "params": [
                {
                    "name": "self",
                    "desc": "",
                    "lua_type": "HasSaveSlots"
                }
            ],
            "returns": [
                {
                    "desc": "",
                    "lua_type": "Promise.Promise<SaveSlotData.SlotId?>\n"
                }
            ],
            "function_type": "static",
            "source": {
                "line": 466,
                "path": "src/saveslot/src/Server/Binders/HasSaveSlots.lua"
            }
        },
        {
            "name": "PromiseSetSlotMetadata",
            "desc": "Sets the metadata for the slot with the given ID",
            "params": [
                {
                    "name": "self",
                    "desc": "",
                    "lua_type": "HasSaveSlots"
                },
                {
                    "name": "slotId",
                    "desc": "",
                    "lua_type": "SaveSlotData.SlotId"
                },
                {
                    "name": "data",
                    "desc": "",
                    "lua_type": "SaveSlotData.SaveSlotMetadata\n"
                }
            ],
            "returns": [
                {
                    "desc": "",
                    "lua_type": "Promise.Promise<any>\n"
                }
            ],
            "function_type": "static",
            "source": {
                "line": 473,
                "path": "src/saveslot/src/Server/Binders/HasSaveSlots.lua"
            }
        },
        {
            "name": "PromiseGetSlotMetadata",
            "desc": "Gets the metadata for the slot with the given ID",
            "params": [
                {
                    "name": "self",
                    "desc": "",
                    "lua_type": "HasSaveSlots"
                },
                {
                    "name": "slotId",
                    "desc": "",
                    "lua_type": "SaveSlotData.SlotId\n"
                }
            ],
            "returns": [
                {
                    "desc": "",
                    "lua_type": "Promise.Promise<SaveSlotData.SaveSlotMetadata?>\n"
                }
            ],
            "function_type": "static",
            "source": {
                "line": 484,
                "path": "src/saveslot/src/Server/Binders/HasSaveSlots.lua"
            }
        },
        {
            "name": "PromiseSlotIdFromIndex",
            "desc": "Returns the slot ID from the given index",
            "params": [
                {
                    "name": "self",
                    "desc": "",
                    "lua_type": "HasSaveSlots"
                },
                {
                    "name": "slotIndex",
                    "desc": "",
                    "lua_type": "number\n"
                }
            ],
            "returns": [
                {
                    "desc": "",
                    "lua_type": "Promise.Promise<SaveSlotData.SlotId?>\n"
                }
            ],
            "function_type": "static",
            "source": {
                "line": 494,
                "path": "src/saveslot/src/Server/Binders/HasSaveSlots.lua"
            }
        },
        {
            "name": "PromiseLastActiveSlotId",
            "desc": "Gets the last active slot ID",
            "params": [
                {
                    "name": "self",
                    "desc": "",
                    "lua_type": "HasSaveSlots"
                }
            ],
            "returns": [
                {
                    "desc": "",
                    "lua_type": "Promise.Promise<SaveSlotData.SlotId?>\n"
                }
            ],
            "function_type": "static",
            "source": {
                "line": 504,
                "path": "src/saveslot/src/Server/Binders/HasSaveSlots.lua"
            }
        },
        {
            "name": "PromiseSelectLastSaveSlot",
            "desc": "Selects the player's last active slot if one still exists, resolving to the\nselected slot id -- or nil when there is no slot to continue on. Backs a\n\"Continue\" affordance that every save-slot consumer tends to need.",
            "params": [
                {
                    "name": "self",
                    "desc": "",
                    "lua_type": "HasSaveSlots"
                }
            ],
            "returns": [
                {
                    "desc": "",
                    "lua_type": "Promise.Promise<SaveSlotData.SlotId?>\n"
                }
            ],
            "function_type": "static",
            "source": {
                "line": 513,
                "path": "src/saveslot/src/Server/Binders/HasSaveSlots.lua"
            }
        },
        {
            "name": "PromiseSelectNewSaveSlot",
            "desc": "Creates a new slot at the lowest free index and selects it, resolving to the\nnew slot id -- or nil when every slot is already in use. Backs a \"New Game\"\naffordance.",
            "params": [
                {
                    "name": "self",
                    "desc": "",
                    "lua_type": "HasSaveSlots"
                }
            ],
            "returns": [
                {
                    "desc": "",
                    "lua_type": "Promise.Promise<SaveSlotData.SlotId?>\n"
                }
            ],
            "function_type": "static",
            "source": {
                "line": 522,
                "path": "src/saveslot/src/Server/Binders/HasSaveSlots.lua"
            }
        },
        {
            "name": "PromiseSelectEphemeralSlot",
            "desc": "Creates a fresh ephemeral slot and selects it, resolving to its id. See\n[HasSaveSlotsDataStore.PromiseSelectEphemeralSlot].",
            "params": [
                {
                    "name": "self",
                    "desc": "",
                    "lua_type": "HasSaveSlots"
                },
                {
                    "name": "metadata",
                    "desc": "optional SlotName/Summary for the in-memory slot",
                    "lua_type": "SaveSlotCreateMetadata?"
                }
            ],
            "returns": [
                {
                    "desc": "",
                    "lua_type": "Promise<SlotId>"
                }
            ],
            "function_type": "static",
            "source": {
                "line": 533,
                "path": "src/saveslot/src/Server/Binders/HasSaveSlots.lua"
            }
        },
        {
            "name": "RegisterSummaryProvider",
            "desc": "Registers a named summary provider. Every registered provider's current value is aggregated into\nthe active slot's Summary, keyed by `name` (see [HasSaveSlots.PromiseGetSlotMetadata]). Registering\nthe same name again replaces the previous provider. Returns a function that unregisters the provider\n(also give it to a [Maid]).",
            "params": [
                {
                    "name": "self",
                    "desc": "",
                    "lua_type": "HasSaveSlots"
                },
                {
                    "name": "name",
                    "desc": "",
                    "lua_type": "string"
                },
                {
                    "name": "provider",
                    "desc": "",
                    "lua_type": "SummaryProvider"
                }
            ],
            "returns": [
                {
                    "desc": "",
                    "lua_type": "() -> ()"
                }
            ],
            "function_type": "static",
            "source": {
                "line": 550,
                "path": "src/saveslot/src/Server/Binders/HasSaveSlots.lua"
            }
        }
    ],
    "properties": [],
    "types": [],
    "name": "HasSaveSlots",
    "desc": "Binds the save slot system to a live [Player].\n\nThe slot model itself -- the roster, per-slot stores, selection, create/delete/reset,\nexport/import, ephemeral slots and playtime -- lives in [HasSaveSlotsDataStore], built here over\nthe player's datastore. What stays behind is everything that only means something for a player in\nthis server: replicating the slot container under them, the client remotes, teleport data, and\nsummary providers (which are handed the [Player]).\n\nEvery slot method below is a straight delegation. Reach for [HasSaveSlotsDataStore] directly only\nwhen there is no player to bind -- admin tooling acting on someone who is not in this server.",
    "source": {
        "line": 16,
        "path": "src/saveslot/src/Server/Binders/HasSaveSlots.lua"
    }
}