Данные двери не сохраняются в Roblox

Я написал систему сохранения дверей. То есть, если пользователь ранее их купил, то при повторном входе в игру они должны быть открыты. Мой код работает, но дверь вообще не сохраняется.

-- DoorsDataStore
-- Save Stats Doors
local opend = false
local datastorage = game:GetService("DataStoreService")
local isitopen_1 = datastorage:GetDataStore("Door")

game.Players.PlayerAdded:Connect(function(player)
    local boolValueDoors = Instance.new("Folder")
    boolValueDoors.Name = "BoolValueDoors"
    boolValueDoors.Parent = player
    
    local door_1 = Instance.new("BoolValue")
    door_1.Parent = boolValueDoors
    door_1.Name = "BoolValueDoor_1"
    door_1.Value = isitopen_1:GetAsync(player.UserId)  
    print("True or False")
    print(player.BoolValueDoor_1.Value)
end)

game.Players.PlayerRemoving:Connect(function(player)
    
    local success, erromsg = pcall(function()
        isitopen_1:SetAsync(player.UserId, player.BoolValueDoor_1.Value)
    end)
    
    if erromsg then
        warn("Error")
    end
end)
-- TouchDoor
script.Parent.Touched:Connect(function(hit)
    local humanoid = hit.Parent:FindFirstChild("Humanoid")
    if (humanoid ~= nil) then
        local player = game.Players:GetPlayerFromCharacter(hit.Parent)
        if player.leaderstats.Coins.Value >= script.Parent.Price.Value then
            player.leaderstats.Coins.Value -= script.Parent.Price.Value
            player.leaderstats.Level.Value += 1
            script.Parent:Destroy()
            player.BoolValueDoors.BoolValueDoor_1.Value = true
            print("Save Door")
        end
    end
end)        

Пробовал писать этот код по-разному, в разных версиях, пробовал через валидацию. Мой код все еще не делает то, что я хочу.

Является ли сценарий сенсорной двери локальным сценарием? Также я заметил, что нет кода, который определяет, является ли BoolValueDoor_1 истинным, когда игрок присоединяется.

kingerman88 15.02.2023 20:44

Это не локалскрипт. Как проверить?

Nerman 15.02.2023 21:38
Конечные и Readonly классы в PHP
Конечные и Readonly классы в PHP
В прошлом, когда вы не хотели, чтобы другие классы расширяли определенный класс, вы могли пометить его как final.
От React к React Native: Руководство для начинающих по разработке мобильных приложений с использованием React
От React к React Native: Руководство для начинающих по разработке мобильных приложений с использованием React
Если вы уже умеете работать с React, создание мобильных приложений для iOS и Android - это новое приключение, в котором вы сможете применить свои...
БЭМ: Конвенция об именовании CSS
БЭМ: Конвенция об именовании CSS
Я часто вижу беспорядочный код CSS, особенно если проект большой. Кроме того, я совершал эту ошибку в профессиональных или личных проектах и...
Революционная веб-разработка ServiceNow
Революционная веб-разработка ServiceNow
В быстро развивающемся мире веб-разработки ServiceNow для достижения успеха крайне важно оставаться на вершине последних тенденций и технологий. По...
Как добавить SEO(Search Engine Optimization) в наше веб-приложение и как это работает?
Как добавить SEO(Search Engine Optimization) в наше веб-приложение и как это работает?
Заголовок веб-страницы играет наиболее важную роль в SEO, он помогает поисковой системе понять, о чем ваш сайт.
Конфигурация Jest в angular
Конфигурация Jest в angular
В этой статье я рассказываю обо всех необходимых шагах, которые нужно выполнить при настройке jest в angular.
0
2
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я вижу несколько возможных проблем:

1. SetAsync принимает строку в качестве первого аргумента, вы даете ему числовое значение. Чтобы исправить это, используйте tostring(player.UserId)

2. Когда игрок впервые присоединяется, значение будет равно nil, потому что в хранилище данных нет данных под UserId, а nil не является логическим значением.

Я не уверен, являются ли это реальными проблемами, и в настоящее время я не могу проверить, являются ли они реальными проблемами, потому что я не на своем компьютере, но это может быть то, что вы хотите изменить. Также было бы неплохо узнать, столкнулись ли вы с какими-либо ошибками при выполнении кода.

Вы также должны вызвать удаленное событие, которое открывает дверь на стороне клиента в функции PlayerAdded, если значение равно true.

Пытался решить проблему вашими методами, но не помогло. Пожалуйста, помогите мне в этом. Я написал код, и я не получил никаких ошибок.

Nerman 16.02.2023 16:25

Первый скрипт (DoorsDataStore) был написан для сохранения данных игрока. Этот скрипт должен был хранить информацию о том, открыл игрок эту дверь или нет. Если они открыты, они должны оставаться открытыми и храниться.

Nerman 16.02.2023 16:25

Второй скрипт (TouchDoor) сделал так, что когда игрок касался двери, скрипт проверял, есть ли у игрока необходимое количество монет. Если есть, добавляется 1 уровень и вычитаются монеты, а затем меняются данные таблицы лидеров. После этого дверь исчезает, уничтожается (script.Parent:Destroy()).

Nerman 16.02.2023 16:25

Не разрушайте дверь, вместо этого установите ее прозрачность на 1 и установите CanCollide на false. Кроме того, с учетом того, как вы это заскриптовали, дверь будет открываться для всех, если какой-либо игрок прикоснется к ней. Чтобы это было просто локально, используйте оператор if, чтобы гарантировать, что игрок, который касается двери, является локальным игроком. Чтобы дверь открывалась при повторном присоединении, вы должны указать клиенту открыть дверь на стороне клиента с помощью удаленного события. В противном случае он сохранит состояние двери, но не откроет ее, если дверь была открыта. Затем в локальном скрипте сделайте так, чтобы при запуске события дверь открывалась.

F-14 17.02.2023 12:07

Причина, по которой вы должны использовать удаленное событие, заключается в том, что это серверный сценарий, и если вы откроете дверь в серверном сценарии, она откроется для всех.

F-14 17.02.2023 12:09

Также причина, по которой это не работает, может заключаться в том, что, разрушая дверь, вы уничтожаете сценарий, который затем делает все, что написано после оператора уничтожения, недействительным и не будет запускаться.

F-14 17.02.2023 12:10

На самом деле я не знаю, хотите ли вы, чтобы дверь открывалась только на стороне клиента. Если вы не хотите, чтобы она открывалась только на стороне клиента, а вместо этого на стороне сервера, просто откройте дверь в сценарии, а не с помощью удаленных событий.

F-14 17.02.2023 12:11

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

Nerman 17.02.2023 21:03

Вы можете найти информацию об удаленных событиях и о том, как их использовать, в документации создателя roblox.

F-14 18.02.2023 21:26

Другие вопросы по теме