尝试使用 'waitforchild' Roblox Studio 索引 nil

问题描述 投票:0回答:1

当我运行这个应该保存玩家位置的脚本时,代码给我错误,ServerScriptService.PositionHandler:34: attempts to index nil with 'WaitForChild'

有谁知道如何修复这个错误?


local datastoreservice = game:GetService("DataStoreService")

local posdata = datastoreservice:GetDataStore("PlayerPos")


local function setupData(player, char)
    local value = Instance.new("CFrameValue")
    value.Name = "Position"
    value.Parent = player
    
    local good, bad = pcall(function()
        local data = posdata:GetAsync(player.UserId)
        
        if data then
            local deserialzed = CFrame.new(table.unpack(data))
            
            value.Value = deserialzed
            
            char:SetPrimaryPartCFrame(value.Value)
        else
            value.Value = char:FindFirstChild("HumanoidRootPart").CFrame
        end
    end)
    if good then
        print("loaded data")
    else
        warn(bad)
    end
end


local function saveData(plr)
    local good, bad = pcall(function()
        local serialized = {plr:WaitForChild("Position").Value:GetComponents()}
        posdata:SetAsync(plr.UserId, serialized)
    end)
    if good then
        print("saved")
    else
        warn(bad)
    end
end

local function updateData (plr, char)
    local value = plr:FindFirstChild("Position", 1)
    value.Value = char:FindFirstChild("HumanoidRootPart").CFrame
end

game.Players.PlayerAdded:Connect(function(plr)
    plr.CharacterAdded:Connect(function(char)
        setupData(plr, char)
        
        while task.wait(5) do
            updateData(plr, char)
        end
    end)
end)

game.Players.PlayerRemoving:Connect(function(plr)
    saveData(plr)
end)

game:BindToClose(function(plr)
    print("server shut down")
    saveData(plr)
end)

这段代码基本上设置了一个 cframe 值并执行一些数据存储操作,我真的忘记了它是如何工作的。无论如何,请帮忙,因为我真的不知道该怎么办。

roblox
1个回答
0
投票

local Players,DS=game.Players,game:GetService"DataStoreService":GetDataStore"PlayerPos"

local rs=game:service"RunService".Stepped
local function savedata(player)
    DS:SetAsync(""..player.UserId,{player.Value.Value:GetComponents()})
end
local function teleport(char)rs:Wait()
    local pos=Players[char.Name].Value.Value.p
    if pos~=Vector3.new()then char:move(pos)end
end
local function onPlayerAdded(player)
    Instance.new("CFrameValue",player).Value*=CFrame.new(unpack(DS:GetAsync(""..player.UserId)or{Vector3.new()}))
    player.CharacterAdded:Connect(teleport)
    local char=player.Character;char=char and teleport(char)
    savedata(player:GetPropertyChangedSignal"Parent":Wait()or player)
end;Players.PlayerAdded:Connect(onPlayerAdded)
for _,v in ipairs(Players:players())do onPlayerAdded(v)end
game:BindToClose(function()
    wait(3)
end)

© www.soinside.com 2019 - 2024. All rights reserved.