Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Example: Player Data

A complete example of synchronizing player data between server and client.

Server Script

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local ReplicatedRegistry = require(ReplicatedStorage.ReplicatedRegistry2)
local server = ReplicatedRegistry.server

-- Setup remotes
server.set_remote_instances(
    ReplicatedStorage.RequestFullRemote,
    ReplicatedStorage.SendChangesRemote
)

-- Custom validation
server.callbacks.validate_full_request = function(player, key)
    -- Only allow players to access their own data
    return key == player.UserId
end

local playerDataFilter = ReplicatedRegistry.get_filter({
    rate_limit = 10, -- Max 10 updates per second
    custom = function(sender, register_key, tbl, changes)
    -- Player can only access their own keys
        if sender.UserId ~= register_key then
            return false
        end
        
        for _, c in changes do
            local value, path = c.v, c.p
            -- Prevent negative coins
            if path[1] == "coins" and type(value) == "number" and value < 0 then
                return false
            end
        end
        
        return true
    end
})

Players.PlayerAdded:Connect(function(player)
    local key = player.UserId
    
    -- Create player data
    local playerData = {
        coins = 100,
        level = 1,
        inventory = {},
        settings = {
            sound = true,
            music = true
        }
    }
    
    -- Register for replication
    server.register(key, playerData, playerDataFilter)
    
    -- Listen for changes from client
    ReplicatedRegistry.on_recieve(key, function(sender, tbl, changes)
        print(`Player {sender.Name} updated their data:`)
        for _, change in changes do
            print(`  {table.concat(change.p, ".")} = {change.v}`)
        end
        
        savePlayerData(sender, tbl)
    end)
end)

Players.PlayerRemoving:Connect(function(player)
    local key = player.UserId
    local data = server.view(key)
    
    -- Save before player leaves
    savePlayerData(player, data)
end)

-- Example: Give coins to player
function giveCoins(player, amount)
    local proxy = server.view_as_proxy(player.UserId)
    
    proxy.incr({"coins"}, amount)
    proxy.replicate({player}) -- Send to client
end

-- Example: Update player level
function levelUp(player)
    local data = server.view(player.UserId)
    
    data.level += 1
    data.coins += data.level * 10 -- Bonus coins
    
    server.to_clients(player.UserId, {player})
end

Client Script

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local ReplicatedRegistry = require(ReplicatedStorage.ReplicatedRegistry2)
local client = ReplicatedRegistry.client

-- Setup remotes
client.set_remote_instances(
    ReplicatedStorage.RequestFullRemote,
    ReplicatedStorage.SendChangesRemote
)

local player = Players.LocalPlayer
local key = player.UserId

-- Access player data
local playerData = client.view(key)

-- Listen for updates from server
ReplicatedRegistry.on_recieve(key, function(sender, tbl, changes)
    print("Received update from server:")
    for _, change in changes do
        print(`  {table.concat(change.p, ".")} = {change.v}`)
    end
    
    -- Update UI
    updateCoinsDisplay(tbl.coins)
    updateLevelDisplay(tbl.level)
end)

-- Example: Update settings
function updateSettings(soundEnabled, musicEnabled)
    local proxy = client.view_as_proxy(key)
    
    proxy.set({"settings", "sound"}, soundEnabled)
    proxy.set({"settings", "music"}, musicEnabled)
    
    proxy.replicate() -- Send to server
end

-- Example: Purchase item
function purchaseItem(itemName, cost)
    local data = client.view(key)
    
    if data.coins >= cost then
        data.coins -= cost
        data.inventory[itemName] = true
        
        -- Send to server for validation
        client.to_server(key)
    else
        warn("Not enough coins!")
    end
end