local ServerScriptService = game:GetService("ServerScriptService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local ProfileService = require(ServerScriptService.Modules.ProfileService)
local ProfileTemplate = require(script.ProfileTemplate)
local ProfileStore = ProfileService.GetProfileStore("Test Key", ProfileTemplate)
local module = {}
module.Profiles = {}
-- Функция для загрузки экземпляров игрока и синхронизации их значений
local function LoadPlayerInstances(player, profile)
-- Клонирование значений игрока из шаблона
for _, value in script.PlayerValues:GetChildren() do
value:Clone().Parent = player
end
-- Постоянное обновление leaderstats игрока из профиля
task.spawn(function()
while true do
for _, stat in player.leaderstats:GetChildren() do
local actualValue = profile.Data.leaderstats[stat.Name]
if actualValue then
stat.Value = actualValue
end
end
task.wait(0.5) -- Уменьшена частота до каждых 0.5 секунды
end
end)
end
-- Функция, вызываемая при присоединении игрока
local function PlayerAdded(player)
local profile = ProfileStore:LoadProfileAsync("Player_" .. player.UserId)
if profile then
profile:AddUserId(player.UserId)
profile:Reconcile()
-- Подписка на освобождение профиля
profile:ListenToRelease(function()
module.Profiles[player] = nil
player:Kick("Ваш профиль был освобожден.") -- Добавлено сообщение для ясности
end)
-- Проверка, что игрок все еще в игре перед загрузкой его профиля
if player:IsDescendantOf(Players) then
module.Profiles[player] = profile
LoadPlayerInstances(player, profile)
else
profile:Release() -- Освобождение, если игрок недействителен
end
else
player:Kick("Не удалось загрузить ваш профиль.") -- Добавлено сообщение для ясности
end
end
-- Загрузка профилей для игроков, уже находящихся в игре
for _, player in Players:GetPlayers() do
task.spawn(PlayerAdded, player)
end
-- Подключение функции PlayerAdded к событию PlayerAdded
Players.PlayerAdded:Connect(PlayerAdded)
-- Очистка при выходе игрока
Players.PlayerRemoving:Connect(function(player)
local profile = module.Profiles[player]
if profile then
profile:Release() -- Освобождение профиля игрока при выходе
end
end)
return module
Улучшенный скрипт
Рустам АбдрашитовМыслитель (9465)
2 месяца назад
Основные изменения объяснены:
Сниженная частота обновления: task.wait(0.1) изменено на task.wait(0.5) для снижения нагрузки на сервер, обновляя значения каждые полсекунды вместо десятых долей секунды.
Сообщения об ошибках при исключении: При исключении игроков из-за проблем с их профилями добавлены конкретные сообщения для улучшения пользовательского опыта и отладки.
Описание переменных: Изменены названия переменных, такие как v на value и stat, для лучшей читаемости.
Проверка существования профиля: Добавлена проверка, чтобы убедиться, что actualValue существует перед его присвоением, что предотвращает потенциальные ошибки.
скрипт:
local ServerScriptService = game:GetService("ServerScriptService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local ProfileService = require(ServerScriptService.Modules.ProfileService)
local ProfileTemplate = require(script.ProfileTemplate)
local ProfileStore = ProfileService.GetProfileStore(
"Test Key",
ProfileTemplate
)
local module = {}
module.Profiles = {}
local function LoadPlayerInstances(Player, Profile)
for _, v in script.PlayerValues:GetChildren() do
v:Clone().Parent = Player
end
task.spawn(function()
while true do
for _, v in Player.leaderstats:GetChildren() do
local ActualValue = Profile.Data.leaderstats[ v.Name ]
v.Value = ActualValue
end
task.wait(0.1)
end
end)
end
local function PlayerAdded(Player)
local Profile = ProfileStore:LoadProfileAsync("Player_" .. Player.UserId)
if Profile then
Profile:AddUserId(Player.UserId)
Profile:Reconcile()
Profile:ListenToRelease(function()
module.Profiles[Player] = nil
Player:Kick()
end)
if Player:IsDescendantOf(Player) == true then
module.Profiles[Player] = Profile
LoadPlayerInstances(Player, Profile)
else
Profile:Release()
end
else
Player:Kick()
end
end
for _, Player in Players:GetPlayers() do
task.spawn(PlayerAdded, Player)
end
Players.PlayerAdded:Connect(PlayerAdded)
Players.PlayerRemoving:Connect(function(Player)
local Profile = module.Profiles[Player]
if Profile then
Profile:Release()
end
end)
return module