Что реплицируется, а что нет
- Изменения сервера в Workspace видят все игроки
- Изменения клиента у себя в Workspace видит только он сам
- Содержимое ReplicatedStorage доступно обеим сторонам
- ServerStorage и ServerScriptService клиенту не видны вовсе
RemoteEvent и RemoteFunction
Чтобы клиент и сервер поговорили, между ними ставят RemoteEvent — сообщение без ответа — или RemoteFunction, когда ответ нужен. Лежат они в ReplicatedStorage.
RemoteFunction, вызванная сервером у клиента, может не вернуться никогда: клиент вправе зависнуть или выйти. Поэтому в сторону клиента почти всегда используют RemoteEvent.
local ReplicatedStorage = game:GetService("ReplicatedStorage")local claim = ReplicatedStorage:WaitForChild("ClaimReward")local lastClaim = {}claim.OnServerEvent:Connect(function(player)local now = os.clock()if lastClaim[player.UserId] and now - lastClaim[player.UserId] < 60 thenreturnendlastClaim[player.UserId] = nowlocal coins = player:WaitForChild("leaderstats"):WaitForChild("Coins")coins.Value += 10end)
Первый аргумент OnServerEvent — сам игрок, и подделать его нельзя. Всё остальное — данные от клиента, их проверяют.
Ping и предсказание
Между нажатием у игрока и ответом сервера проходит время. Если ждать ответ на каждое действие, игра будет ощущаться вязкой.
Поэтому клиент показывает результат сразу, а сервер подтверждает его следом. Важно, что показ — это только показ: очки, предметы и урон остаются за сервером.