这是我为一个老式的泥巴游戏写的一个简单的脚本,给那些知道这是什么的人。
基本上,我正在搜索一个表(我从gmcp中读取),并尝试搜索该表上的值,以查看它们中是否有任何值与我正在存储正在查找的值的另一个表中的值相匹配。
通过简单地使用"for“循环从gmcp获取值并将其存储为变量,然后使用另一个"for”循环搜索另一个表以查看是否有任何值与该变量匹配,我已经成功地实现了对单一值的操作。
问题是,它只对一个奇异值有效,如果我需要在该表中检查多个值,则会遗漏所有其他值。
我的代码如下所示:
for _, v in pairs(gmcptable) do
checkvalue = v
end
for _, v in pairs(mytable) do
if v == checkvalue then
echo("yay")
else
echo("no!")
end
end
同样,这适用于具有一个值的gmcp表,但如果有多个值,则会失败。我试着这么做,
for _, v in pairs(gmcptable) do
checkvalue = v
for _, v in pairs(mytable) do
if v == checkvalue then
echo("yay")
else
echo("no!")
end
end
end
我希望它可以设置变量,运行第二个for循环来检查变量,然后对gmcp表中的下一个值重复,因为它是一个for循环,第二个循环在循环中,但这也不起作用。我还试着制作自己的函数来添加和简化它,
function searchtable(table, element)
for _, v in pairs(table) do
if v == element then
return true
else
return false
end
end
end
for _, v in pairs(gmcptable) do
if searchtable(mytable, v) == true then
echo("yay")
else
echo("no!")
end
end
那也是一个突破口。我确信我只是忽略了一些东西,或者展示了我是一个多么业余的人,但是我已经在谷歌上搜索了加载,并尝试了我能想到的一切,但我只是自学,直到最近才开始了解表和for循环是如何工作的。希望有人能很快给我一些有用的东西!
更新!
@Piglet好的,gmcptable实际上是我试图为那些可以回答编码问题的人简化问题。gmcptable实际上是我的客户端通过连接从游戏服务器接收到的一长串表格。所以实际上,我有3个表,我要解析其中的数据。"gmcp.Char.Items.List.items“、"gmcp.Char.Items.Add”和"gmcp.Char.Items.Remove“现在gmcp.Char.Items.List.items是我在游戏中房间里的所有东西的列表。gmcp.Char.Items.Add是进入房间的任何东西的列表,每次除了其他玩家外,任何东西进入房间时都会发送,gmcp.Char.Items.Remove是相同的,但当任何东西离开房间时。我正在尝试使用这些信息来创建一个目标表,该表将自动将所需的目标添加到我的目标队列中,如果它们不在房间中,则将其删除。房间列表(gmcp.Char.Items.List)只有在我进入或退出房间时才会更新,可能也会在我查看时更新,但现在我假设它不会在我查看时更新,因为这将是一个完全不同的问题,稍后需要解决。
我目前有一个简单的脚本,其中我的客户端ID作为触发器,它被设置为当我登录到有问题的游戏时触发一次,该脚本定义了保存我交叉引用gmcp表的值的表,以确定它是否是我想要添加到目标表中的信息,该脚本还将目标表定义为空,这意味着在会话期间,这两个表都存在并被定义。
然后,我添加了三个单独的脚本来解析这三个gmcp表,并确定它们是否在我所需的目标表中,如果是,则添加它;如果是删除表,则检查它当前是否在目标表中,如果是,则将其删除。下面我将展示我正在使用的当前脚本(自昨天以来,这些脚本已经更改了几次,并且在我看到未来对此的回复之前可能会再次更改。我还将包括有问题的gmcp表的外观,如果我当前看到来自我的客户端的任何错误或调试详细信息,我也会包括在内。
log on trigger
match on > ^Password correct\. in perl regex
bashtargets = {}
bashlist = {
"a baby rat",
"a young rat",
"a rat",
"an old rat",
"a black rat"
}
(上面的触发器似乎工作正常,我可以准确地打印表格)
房间里的脚本
事件处理程序> gmcp.Char.Items.List
for _, v in pairs(gmcp.Char.Items.List.items) do
bashname = v.name
bashid = v.id
for _, v in pairs(bashlist) do
if v == bashname then
table.insert(bashtargets, bashid)
end
end
end
脚本addcheck
事件处理程序"gmcp.Char.Items.Add“
for _, v in pairs(gmcp.Char.Items.Add) do
addname = v.name
addid = v.id
for _, v in pairs(bashlist) do
if v == addname then
table.insert(bashtargets, addid)
end
end
end
脚本删除检查
事件处理程序"gmcp.Char.Items.Remove“
for _, v in pairs(gmcp.Char.Items.Remove) do
delid = v.id
for _, v in pairs(bashtargets) do
if v == delid then
table.remove(bashtargets, delid)
end
end
end
gmcp表"gmcp.Char.Items“
{
Remove = {
location = "room",
item = {
id = "150558",
name = "a filthy gutter mutt",
attrib = "m"
}
},
Add = {
location = "room",
item = {
id = "150558",
name = "a filthy gutter mutt",
attrib = "m"
}
},
List = {
location = "room",
items = {
{
id = "59689",
name = "a statue of a decaying gargoyle",
icon = "profile"
},
{
id = "84988",
name = "a gas lamp"
},
{
id = "101594",
attrib = "t",
name = "a monolith sigil",
icon = "rune"
},
{
id = "196286",
name = "a wooden sign"
},
{
id = "166410",
name = "Lain, the Lamplighter",
attrib = "m"
}
}
}
}
我已经成功地解析了几次信息,所以我得到了正确的表和语法,以及gmcp所涉及的内容。使用这一点,我也成功地让它工作了一半。目前的设置似乎一次捕获一个目标,即使有几十个,并添加一个,有时奇怪的是,它添加相同的目标3-5次出于某种原因,不确定为什么,还不能弄清楚。
这两个错误消息已经被我的客户反复输出,我不知道如何处理它们,也不知道如何修复它们。“离开房间”和“进入房间”是当前分配给脚本的名称,用于在客户端的表中添加和删除数据。
[ERROR:] object:<event handler function> function:<left the room>
<Lua error:[string "return left the room"]:1: '<eof>' expected near 'the'>
[ERROR:] object:<event handler function> function:<entered the room>
<Lua error:[string "return entered the room"]:1: '<eof>' expected near 'the'>
我不知道'‘是什么意思,也不知道为什么它会出现在'the’附近。这一切都让我头疼……
通过客户端的调试功能,我可以看到所有的处理程序都是由服务器发送的,所以它不是gmcp……我实际上没有在调试特性上看到任何bug(顺便说一句,它与错误特性是分开的,错误特性不断地输出我提到的另外两个错误。
不管怎样,这就是我的最新进展。希望这能让一些人更好地处理我做错了什么,这样我就可以弄明白这一点,并学习一些新的东西。
再次提前感谢并特别感谢你@Piglet你的回答,我从其中学到了一些新东西,我认为它非常有帮助。
发布于 2016-05-03 17:35:01
在你的第一次尝试中,你有两个独立的循环。您可以覆盖gmcptable中每个元素的校验值。一旦你进入你的第二个循环,校验值将在你的第一个循环中分配最后一个值。因此,您只有一个检查值,并且您只运行一次表,因为您只运行第二个循环一次。
for _, v in pairs(gmcptable) do
checkvalue = v
end
for _, v in pairs(mytable) do
if v == checkvalue then
echo("yay")
else
echo("no!")
end
end
如果我理解你的问题,你的第二次尝试应该行得通。您可以遍历gmcptable的每个元素,并将其与mytable中的每个元素进行比较。因此,只要gmcptable包含一个也包含在mytable中的值,你就会得到一个"yay“。
for _, v in pairs(gmcptable) do
checkvalue = v
for _, v in pairs(mytable) do
if v == checkvalue then
echo("yay")
else
echo("no!")
end
end
end
关于你第三次尝试使用一个函数,有一点要注意。您不应该调用参数table
,因为这样您将无法访问函数中的全局表函数。例如,调用table.sort
将导致错误,因为您将为本地参数表建立索引。
发布于 2016-05-04 20:41:47
好的,我今天晚上对它进行了更多的修改,并不断得到相同的错误,最终我在谷歌上搜索了错误,并逐渐了解到错误是文件结束错误,如果你没有在实际脚本中声明,或者至少这是我对函数的理解,我使用的客户端使用脚本的名称作为函数的名称,所以我没有费心定义函数,如果我在脚本中添加了额外的结尾,客户端会抛出另一个错误,因为它没有定义,所以我猜客户端将它自己的定义添加到函数中,但没有将它自己的端添加到创建了混合的函数中。长话短说,解决方案是将每个脚本定义为一个函数,并添加另一端来关闭函数,从而修复问题。
再次感谢@Piglet的回答,他的回答非常有帮助,而且非常准确!谢谢,伙计!
https://stackoverflow.com/questions/36998444
复制相似问题