Как создать кнопку удаления персонажа из DataStorer в Roblox Studio?

Вопрос или проблема

как создать кнопку, которая будет удалять персонажа из памяти базы данных и заменять его на персонажа DataStorer. Персонаж находится по этому пути: ReplicatedStorage.Characters.Common.Citizen.

моя проблема в том, что гражданин не сохраняется в DataStorer

скрипт кнопки:

local button = script.Parent
local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")

-- Определите место спавна
local spawnLocation = workspace:WaitForChild("SpawnLocation") -- Убедитесь, что в вашем рабочем пространстве есть часть SpawnLocation

button.MouseButton1Click:Connect(function()
  local player = Players.LocalPlayer
  local character = player.Character

  if character then
    character:Destroy()
  end

  -- Клонируйте нового персонажа и настройте его
  local newCharacter = ReplicatedStorage.Characters.Common.Citizen:Clone()
  newCharacter.Name = player.Name  -- Убедитесь, что имя персонажа совпадает с именем игрока
  newCharacter.Parent = workspace
  player.Character = newCharacter

  -- Подождите, пока персонаж будет настроен, прежде чем вносить изменения
  newCharacter:WaitForChild("HumanoidRootPart")
  newCharacter:WaitForChild("Humanoid")

  -- Переместите нового персонажа в место спавна
  newCharacter:SetPrimaryPartCFrame(spawnLocation.CFrame)

  -- Установите камеру, чтобы следить за новым персонажем
  workspace.CurrentCamera.CameraSubject = newCharacter:FindFirstChild("Humanoid")
  workspace.CurrentCamera.CameraType = Enum.CameraType.Custom
end)

DataStorer_DataStore:

local DataStoreService = game:GetService("DataStoreService")
local config = script:WaitForChild("datastore_config")
local myDataStore = DataStoreService:GetDataStore("$Data$!"..config:FindFirstChild("DataVersion").Value)

local saving = config:FindFirstChild("Saving")
local autoSave = config:FindFirstChild("AutoSave")

local function create_table(plr)
    local player_stats = {}

    for _, folder in pairs(script:FindFirstChild("Plr"):GetChildren()) do 
        if folder:IsA("Folder") then
            print(folder)
            for _, stat in pairs(plr:FindFirstChild(folder.Name):GetChildren()) do
                player_stats[stat.Name.." "..folder.Name] = stat.Value
            end
        end
    end

    return player_stats
end

local function saveData(plr)
    local player_stats = create_table(plr)

    local succes, err = pcall(function()
        local key = plr.UserId.."'s' Data"
        myDataStore:SetAsync(key, player_stats)
    end)

    if succes then
        print("Данные успешно сохранены!")
    else
        warn(err)
    end
end

game.Players.PlayerAdded:Connect(function(plr)
    local key = plr.UserId.."'s' Data"
    local data = myDataStore:GetAsync(key)

    print(data)

    for _, folder in pairs(script:FindFirstChild("Plr"):GetChildren()) do

        if folder:IsA("Folder") then

            local fc = folder:Clone()
            fc.Parent = plr

            if saving.Value == true then
                for _, item in pairs(fc:GetChildren()) do           
                    if data then
                        item.Value = data[item.Name.." "..folder.Name]
                        continue
                    else
                        warn("Данные отсутствуют!")
                        continue
                    end
                end             
            end
        end
        
        while autoSave.Value > 0 do
            task.wait(autoSave.Value * 60)
            saveData(plr)
            print("Сохранено", data)
        end
        
    end
end)


game.Players.PlayerRemoving:Connect(function(plr)
    if saving.Value == true then
        saveData(plr)
    end
end)

База данных содержит все данные.

Если вам нужна дополнительная информация, я отвечу в комментариях

Ответ или решение

Для создания кнопки, которая удаляет персонажа игрока из памяти и заменяет его на персонажа из DataStorer в Roblox Studio, вам нужно внести несколько изменений в ваши скрипты. Ваша основная проблема в том, что персонаж «Citizen» не сохраняется в DataStore. Мы должны убедиться, что данные персонажа сохраняются в DataStore и загружаются правильно. Давайте разберем ваши скрипты и добавим необходимые изменения.

Шаг 1: Сохранение данных персонажа

В вашем DataStorer_DataStore добавим функцию, которая будет сохранять данные персонажа «Citizen» в DataStore при его создании или замене.

  1. Добавьте новую функцию, которая сохраняет тип персонажа в create_table.
local function create_table(plr)
    local player_stats = {}

    -- Сохранение статусов
    for _, folder in pairs(script:FindFirstChild("Plr"):GetChildren()) do 
        if folder:IsA("Folder") then
            print(folder)
            for _, stat in pairs(plr:FindFirstChild(folder.Name):GetChildren()) do
                player_stats[stat.Name.." "..folder.Name] = stat.Value
            end
        end
    end

    -- Сохранение информации о персонаже
    player_stats["CharacterType"] = "Citizen"  -- Здесь может быть и другой тип персонажа
    return player_stats
end

Шаг 2: Загрузка данных персонажа

Чтобы восстановить персонажа при входе в игру, вы должны использовать информацию из DataStore. Убедитесь, что вы проверяете тип персонажа и создаете нового персонажа в зависимости от этого.

game.Players.PlayerAdded:Connect(function(plr)
    local key = plr.UserId.."'s' Data"
    local data = myDataStore:GetAsync(key)

    print(data)

    for _, folder in pairs(script:FindFirstChild("Plr"):GetChildren()) do
        if folder:IsA("Folder") then
            local fc = folder:Clone()
            fc.Parent = plr

            if saving.Value == true then
                for _, item in pairs(fc:GetChildren()) do           
                    if data then
                        item.Value = data[item.Name.." "..folder.Name]
                    else
                        warn("Данных нет!")
                    end
                end             
            end
        end

        if data and data["CharacterType"] == "Citizen" then
            -- Логика для создания персонажа Citizen
            local citizenChar = ReplicatedStorage.Characters.Common.Citizen:Clone()
            citizenChar.Name = plr.Name
            citizenChar.Parent = workspace
            plr.Character = citizenChar
        end

        while autoSave.Value > 0 do
            task.wait(autoSave.Value * 60)
            saveData(plr)
        end        
    end
end)

Шаг 3: Скрипт кнопки удаления персонажа

Теперь давайте немного изменим ваш скрипт кнопки для удаления персонажа:

local button = script.Parent
local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")

-- Определение местоположения спавна
local spawnLocation = workspace:WaitForChild("SpawnLocation")

button.MouseButton1Click:Connect(function()
    local player = Players.LocalPlayer
    local character = player.Character

    if character then
        -- Удаление текущего персонажа
        character:Destroy()
    end

    -- Клонирование нового персонажа и настройка
    local newCharacter = ReplicatedStorage.Characters.Common.Citizen:Clone()
    newCharacter.Name = player.Name 
    newCharacter.Parent = workspace
    player.Character = newCharacter

    -- Ожидание настройки персонажа
    newCharacter:WaitForChild("HumanoidRootPart")
    newCharacter:WaitForChild("Humanoid")

    -- Перемещение нового персонажа к спавн-локации
    newCharacter:SetPrimaryPartCFrame(spawnLocation.CFrame)

    -- Настройка камеры
    workspace.CurrentCamera.CameraSubject = newCharacter:FindFirstChild("Humanoid")
    workspace.CurrentCamera.CameraType = Enum.CameraType.Custom

    -- Сохранение нового персонажа в DataStore (если нужно)
    local player_stats = create_table(player)  -- Обновление данных
    saveData(player)  -- Сохранение данных игрока
end)

Заключение

Теперь у вас должна быть правильно работающая кнопка, которая удаляет текущего персонажа игрока, создает новый на основе Citizen и сохраняет информацию о персонаже в DataStore. Убедитесь, что все части скрипта работают правильно и что вы отладили все возможные ошибки.

Если у вас возникнут другие вопросы или неясности, не стесняйтесь обращаться за дополнительной помощью!

Оцените материал
Добавить комментарий

Капча загружается...