我在Roblox Lua脚本中遇到了问题,我想编写脚本以便在死亡时保留库存。有什么建议吗?

我想编写一份脚本,以便玩家死亡时库存中的东西不会消失。这是我的当前脚本,您有关于如何实现此目标的任何指针或提示?我已将其编写为本地和服务器脚本,并放在工作区,但仍然没有成功

local Inventory = {}

local function Spawned(Char)
    local Plr = game.Players:GetPlayerFromCharacter(Char)
    for i,v in pairs(Inventory[Plr]) do
        if Plr['Backpack']:findFirstChild(v.Name) then
            Plr['Backpack'][v.Name]:Destroy()
        end
        v.Parent = Plr['Backpack']
    end
    Inventory[Plr] = {}
    Char:WaitForChild('Humanoid').Died:connect(function()
        for i,v in pairs({Plr['Backpack'], Char}) do
            for ii,vv in pairs(v:GetChildren()) do
                if vv:IsA('Tool') then
                    table.insert(Inventory[Plr], vv:Clone())
                     vv:Destroy()
                end
            end
         end
     end)
 end

game.Players.PlayerAdded:connect(function(Plr)
    Inventory[Plr] = {}
    local Char = Plr.Character or Plr.CharacterAdded:wait()
    Spawned(Char)
    Plr.CharacterAdded:connect(Spawned)
end)
点赞
用户8310531
用户8310531

将想要在玩家死亡时持续存在的物品放在 Player.StarterGear 中。

2018-07-16 19:59:39
用户5373986
用户5373986

有几种不同的方法可以存储玩家的物品清单,我会展示一些,以便您可以看到它们。

1. 在 StarterGear 中存储武器

正如 Coordinate Newton 所说,一旦玩家购买武器,您可以将武器放入他们的 .StarterGear 文件夹中,这意味着每次重生时,工具将自动放置在他们的新背包中。这很简单,因为您只需要将武器克隆到:

game.Players.LocalPlayer.StarterGear

以及玩家的背包中。您在评论中提到您已经尝试过这个方法,但是没有起作用,但是我恐怕无法想出原因。

2. 使用 IntValue 作为全局变量

如果不能使用上面的方法,则另一种方法是在购买武器时创建一个新的 IntValue 实例,并在移除武器时销毁它。如果您使用武器的名称来命名 IntValue,则可以使用代码在复制存储中查找该武器。

例如,下面的代码,如果放入本地脚本中,将创建一个用于存储 IntValues 的文件夹,然后每次玩家重生时,代码将遍历所有这些 IntValues 获取名称,并将相应的武器放入玩家的背包中。

game.Players.LocalPlayer.CharacterAdded:Connect(function()
    local Children = Storage:GetChildren()
    if #Children > 0 then -- 如果有存储的武器
        for _, child in pairs(Children) do
            -- 下面: 使用 IntValue 中的名称从复制存储中克隆武器
            local WeaponClone = game.ReplicatedStorage:FindFirstChild(tostring(child.Name)):Clone()
            WeaponClone.Parent = game.Players.LocalPlayer.Backpack
        end
    end
end)

local Storage = Instance.new("Folder") -- 用于存储当前武器的文件夹
Storage.Name = "BoughtWeapons"
Storage.Parent = game.Player.LocalPlayer

我还制作了两个可以调用以创建和销毁 IntValue 的函数。

local function WeaponBought(WeaponName)
    local WeaponSave = Instance.new("IntValue")
    WeaponSave.Name = WeaponName
    WeaponSave.Parent = game.Players.LocalPlayer.BoughtWeapons
end

local function WeaponRemoved(WeaponName)
    game.Players.LocalPlayer.BoughtWeapons:FindFirstChild(WeaponName):Destroy()
end

您可以将这两个函数放在任何本地脚本中,它们不必与其他主要代码在一起。您只需要将玩家拥有的武器名称传递给函数即可,例如:

WeaponBought("GravityCoil")

这将在文件夹中创建一个名为 "GravityCoil" 的 IntValue,以便玩家重生时使用。这不如简单地使用 StarterGear 文件夹舒适,但如果由于某种原因无法使用它,则这是一个很好的第二选择。

这种解决方案的一个小问题是需要将武器存储在复制存储中,而剥削者可以很容易地获取它们而不必购买它们。不幸的是,这仅是使用本地脚本执行此操作导致的问题。

您的代码

我相信您的代码没有按预期工作的原因是,据我所知,在 Humanoid.Died 触发时,玩家的背包已经被清空,因此您将无法获取玩家拥有的武器列表。

我希望这有助于您正在尝试的内容,即使这不完全是您要求的。

2018-07-17 12:15:10