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
要添加一个新的键,请使用以下命令: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 ...循环中的任何测试键都将被定义为唯一的。
我找到了使用“table.insert”完成此操作的另一种方法。
我为玩家创建了自定义ID,用于搜索所选玩家的值。
很不幸,我使用了两个表,但实际上这样更容易完成。
简要说明:
- 搜索玩家。如果存在,将表序号保存到变量中。
- 添加新玩家,如果不存在,则保存编号。
- 为具有相同ID的其他表添加值。
谢谢你的答复,它非常有用 :)
这一行的 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
如你所愿,我正确地理解了你的需求 ...
你想统计每个玩家的团队杀戮,并且希望该值持久存在。
然而,你的方法并不是很理想。团队杀戮计数器应该是玩家的一部分。这也将简化并缩短你的代码。
以下是一个示例,展示了如何实现。
- 你希望在服务器启动和世界加载后尽快运行这个脚本
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 中
请注意: 你必须手动将计数器同步到客户端,这不应该是一个大问题。
更多阅读:
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

所以你基本上想要将一个新的玩家添加到已经存在的表中。如果是这样,那么就非常简单:
在你的情况下,如果 steam ID 存储在
ply中,那么我们只需要将你的值添加到表adminbot_players中,键为ply。在这种情况下,它会是: