Lua 中的表键和值 - 不知道怎么做

我想要创建一个动态的玩家表,其中包含两个信息。提供为字符串的玩家 SteamID 将作为键,该值应为一个数字。

应该看起来像 table = { "ExampleSteamID" = 3, "ExampleSteamID2" = 4 }

我发现了像 table.insert(table, { key = x, value = z}) 这样的东西,但是它没能正常工作。

gameevent.Listen("player_connect")

local function AdminBotOnJoinCheck(data)
    local ply = data.networkid -- 加入玩家的 SteamID
    local tableisempty = true -- 一些随机的东西
    for k, tableply in pairs(adminbot_players) do -- 检查已经写入表格的玩家,也许需要修复
        if not ply == tableply then
            --需要在这里编写代码
            MsgC("\nAdminBot: Player table updated | ", ply, "\n")
        end
        tableisempty = false --清除 table = table,只需不执行代码即可。
    end
    if tableisempty == true then
        --在这里相同的代码
        MsgC("\nAdminBot: Player table updated | ", ply, "\n")
    end
    if file.Exists("adminbotplayers.txt", "DATA") == true and adminbot_teamkills_use_file == true then -- 随机的文件写入内容
        local adminbot_players_json = util.TableToJSON(adminbot_players)
        file.Write("adminbotplayers.txt", adminbot_players_json)
    end
end
点赞
用户1381216
用户1381216

所以你基本上想要将一个新的玩家添加到已经存在的表中。如果是这样,那么就非常简单:

theTable[key] = value

在你的情况下,如果 steam ID 存储在 ply 中,那么我们只需要将你的值添加到表 adminbot_players 中,键为 ply。在这种情况下,它会是:

adminbot_players[ply] = 5
2016-10-12 23:36:07
用户1979882
用户1979882

要添加一个新的键,请使用以下命令:table[newkey] = newvalue

你对唯一值的实现是错误的:

local yourwantedkeydefinedsomewhere = "yourwantedkeydefinedsomewhere"
local found = false
for k, tableply in pairs(adminbot_players) do --检查已经写入表格的玩家,也许需要修复
           if ply == tableply then
                  found = true
                     break
            end
           tableisempty = false --清除表格=表格打破 - 只是不执行代码。
    end

       if not found then
            adminbot_players[yourwantedkeydefinedsomewhere] = ply
            MsgC("\nAdminBot: 玩家表更新 | ", ply, "\n")
    end

在你的情况下,for k,table ...循环中的任何测试键都将被定义为唯一的。

2016-10-12 23:44:15
用户7010581
用户7010581

我找到了使用“table.insert”完成此操作的另一种方法。

我为玩家创建了自定义ID,用于搜索所选玩家的值。

很不幸,我使用了两个表,但实际上这样更容易完成。

简要说明:

  • 搜索玩家。如果存在,将表序号保存到变量中。
  • 添加新玩家,如果不存在,则保存编号。
  • 为具有相同ID的其他表添加值。

谢谢你的答复,它非常有用 :)

2016-10-13 17:33:10
用户1836540
用户1836540

这一行的 Lua 语法不正确

table = { "ExampleSteamID" = 3, "ExampleSteamID2" = 4 }

正确的方法为:

table = { ["ExampleSteamID"] = 3, ["ExampleSteamID2"] = 4 }

简化版您的代码(我希望我理解得对)

adminbot_players = {}
local function AdminBotOnJoinCheck(data)
    local ply = data.networkid
    adminbot_players[ply] = { ["ExampleSteamID"] = 3, ["ExampleSteamID2"] = 4 };
    MsgC("\nAdminBot: 玩家表已更新 | ", ply, "\n");
    if file.Exists("adminbotplayers.txt", "DATA") and adminbot_teamkills_use_file then
        file.Write("adminbotplayers.txt", util.TableToJSON(adminbot_players))
    end
end
2016-10-23 01:31:43
用户4273199
用户4273199

如你所愿,我正确地理解了你的需求 ...

你想统计每个玩家的团队杀戮,并且希望该值持久存在。

然而,你的方法并不是很理想。团队杀戮计数器应该是玩家的一部分。这也将简化并缩短你的代码。

以下是一个示例,展示了如何实现。

- 你希望在服务器启动和世界加载后尽快运行这个脚本

local playerMeta = FindMetaTable( "Player" ) -- 获取玩家的元表

function playerMeta:AddTeamkill() -- 此函数将增加计数器
    local teamkills = self:GetPData("teamkills", 0)
    self:SetPData("teamkills", teamkills + 1)
end

function playerMeta:GetTeamkills() -- 此函数将返回当前计数器
    return self:GetPData("teamkills", 0)
end

-- 可以在此添加更多功能... 例如设置或重置计数器

你可以像这样使用它:

-- 增加一次团队杀戮
local player_that_teamkilled = player.GetByID(1) -- 显然,你可以以其他方式获取玩家...
player_that_teamkilled:AddTeamkill()

-- 获取团队杀戮数
local somePlayer = player.GetByID(1) -- 如上
somePlayer:GetTeamkills()

你不必对加载和保存计数器的代码进行修改。你也不必担心与玩家有关的信息是否存在不同表中。这意味着你不必跟踪哪个表中的哪一行属于谁。这也意味着你不必在(可能非常大的)表中搜索正确的行,只需修改(或读取)一个数字即可。

该计数器将保存到 sv.db 中。如果你在客户端上运行此代码(不建议这样做),它将保存到 cl.db 中

请注意: 你必须手动将计数器同步到客户端,这不应该是一个大问题。

更多阅读:

FindMetaTable()

Player:GetPData()

Player:SetPData()

2017-07-04 14:02:18