Я написал систему сохранения дверей. То есть, если пользователь ранее их купил, то при повторном входе в игру они должны быть открыты. Мой код работает, но дверь вообще не сохраняется.
-- 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)
Пробовал писать этот код по-разному, в разных версиях, пробовал через валидацию. Мой код все еще не делает то, что я хочу.
Это не локалскрипт. Как проверить?
Я вижу несколько возможных проблем:
1. SetAsync принимает строку в качестве первого аргумента, вы даете ему числовое значение. Чтобы исправить это, используйте tostring(player.UserId)
2. Когда игрок впервые присоединяется, значение будет равно nil, потому что в хранилище данных нет данных под UserId, а nil не является логическим значением.
Я не уверен, являются ли это реальными проблемами, и в настоящее время я не могу проверить, являются ли они реальными проблемами, потому что я не на своем компьютере, но это может быть то, что вы хотите изменить. Также было бы неплохо узнать, столкнулись ли вы с какими-либо ошибками при выполнении кода.
Вы также должны вызвать удаленное событие, которое открывает дверь на стороне клиента в функции PlayerAdded, если значение равно true.
Пытался решить проблему вашими методами, но не помогло. Пожалуйста, помогите мне в этом. Я написал код, и я не получил никаких ошибок.
Первый скрипт (DoorsDataStore) был написан для сохранения данных игрока. Этот скрипт должен был хранить информацию о том, открыл игрок эту дверь или нет. Если они открыты, они должны оставаться открытыми и храниться.
Второй скрипт (TouchDoor) сделал так, что когда игрок касался двери, скрипт проверял, есть ли у игрока необходимое количество монет. Если есть, добавляется 1 уровень и вычитаются монеты, а затем меняются данные таблицы лидеров. После этого дверь исчезает, уничтожается (script.Parent:Destroy()).
Не разрушайте дверь, вместо этого установите ее прозрачность на 1 и установите CanCollide на false. Кроме того, с учетом того, как вы это заскриптовали, дверь будет открываться для всех, если какой-либо игрок прикоснется к ней. Чтобы это было просто локально, используйте оператор if, чтобы гарантировать, что игрок, который касается двери, является локальным игроком. Чтобы дверь открывалась при повторном присоединении, вы должны указать клиенту открыть дверь на стороне клиента с помощью удаленного события. В противном случае он сохранит состояние двери, но не откроет ее, если дверь была открыта. Затем в локальном скрипте сделайте так, чтобы при запуске события дверь открывалась.
Причина, по которой вы должны использовать удаленное событие, заключается в том, что это серверный сценарий, и если вы откроете дверь в серверном сценарии, она откроется для всех.
Также причина, по которой это не работает, может заключаться в том, что, разрушая дверь, вы уничтожаете сценарий, который затем делает все, что написано после оператора уничтожения, недействительным и не будет запускаться.
На самом деле я не знаю, хотите ли вы, чтобы дверь открывалась только на стороне клиента. Если вы не хотите, чтобы она открывалась только на стороне клиента, а вместо этого на стороне сервера, просто откройте дверь в сценарии, а не с помощью удаленных событий.
Я не совсем понимаю тебя. Я хочу хранить информацию об открытии двери каждого игрока. Я никогда раньше не использовал удаленные события, поэтому мало о них знаю.
Вы можете найти информацию об удаленных событиях и о том, как их использовать, в документации создателя roblox.
Является ли сценарий сенсорной двери локальным сценарием? Также я заметил, что нет кода, который определяет, является ли BoolValueDoor_1 истинным, когда игрок присоединяется.