如何检查玩家是不是已经在另一个桌子/房间? - 卢阿

Posted

技术标签:

【中文标题】如何检查玩家是不是已经在另一个桌子/房间? - 卢阿【英文标题】:How can I check if a Player is already in another table/room? - Lua如何检查玩家是否已经在另一个桌子/房间? - 卢阿 【发布时间】:2021-12-30 23:54:59 【问题描述】:

我有一个名为:Rooms 的表格/字典,当客户想要加入房间时,我检查房间 UID 是否匹配:Rooms[i]["UID"] == Data,如果 UID 匹配,我检查玩家是否已经在房间中,如果不是,我将玩家添加到他们想要加入的特定房间,但我遇到了一些问题。

local Rooms = 
    [1] = 
        ["Name"] = "test1",
        ["Players"] = ,
        ["UID"] = game:GetService("HttpService"):GenerateGUID(true)
    ,
    [2] = 
        ["Name"] = "test2",
        ["Players"] = ,
        ["UID"] = game:GetService("HttpService"):GenerateGUID(true)
    

RemoteEvent.OnServerEvent:Connect(function(Player, Key, Data)
    if Key == "Join" then
        for i = 1, #Rooms do
            if Rooms[i]["UID"] == Data then
                if #Rooms[i]["Players"] > 0 then
                    for a = 1, #Rooms[i]["Players"] do
                        if Rooms[a]["Players"][a] == Player then
                            print("You are already in the room")
                        else
                            RemoteEvent:FireClient(Player, "Success")
                            table.insert(Rooms[a]["Players"], Player)
                        end
                    end
                else
                    RemoteEvent:FireClient(Player, "Success")
                    table.insert(Rooms[i]["Players"], Player)
                end             
            end
        end
    end
end)

现在的问题是我的代码允许玩家加入两个房间。例如:玩家加入房间[1]并尝试再次加入房间[1],它打印:You are already in the room;这是完美的工作! 但问题是当玩家想要移动到房间 [2] 时,它不会检查玩家是否已经在另一个房间。

TL;DR:

玩家加入房间 [1]。 输出:玩家加入了房间 [1]。 玩家再次加入房间 [1]。 输出:你已经在房间里了。 玩家加入房间 [2]。 输出(错误):玩家加入了房间 [2]。

玩家不应该加入房间 [2],因为他们没有离开房间 [1],但是我如何检查玩家是否在不同的房间?

【问题讨论】:

此代码示例中有什么问题? @Kylaaa 我编辑了我的帖子并添加了额外的信息。 【参考方案1】:

试试这个:

RemoteEvent.OnServerEvent:Connect(function(Player, Key, Data)
    if Key == "Join" then
        local targetRoomNum = nil
        for i, room in pairs(Rooms) do
            if room["UID"] == Data then
                targetRoomNum = i
            end

            for _, playerInRoom in pairs(room["Players"]) do
                if playerInRoom == Player then
                    print("You are already in a room")
                    return
                end
            end
        end
        
        if targetRoomNum then
            RemoteEvent:FireClient(Player, "Success")
            table.insert(Rooms[targetRoomNum]["Players"], Player)
        else
            print("No room found")
        end  
    end
end)

【讨论】:

完美运行,欣赏!

以上是关于如何检查玩家是不是已经在另一个桌子/房间? - 卢阿的主要内容,如果未能解决你的问题,请参考以下文章

如何检查一个音频是不是出现在另一个?

有两张桌子的房间实体?

如何使用 Oracle SQL 约束检查酒店房间是不是已预订

如何检查数据是不是插入到房间数据库中

如何在 CodeIgniter 中选择免费房间进行预订 - 两张桌子?

如何编写一个触发器来检查一个值是不是已经在表中?