Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在一个表中收集多个数据,然后像一个连接字符串一样输出到LUA中_Lua_World Of Warcraft - Fatal编程技术网

如何在一个表中收集多个数据,然后像一个连接字符串一样输出到LUA中

如何在一个表中收集多个数据,然后像一个连接字符串一样输出到LUA中,lua,world-of-warcraft,Lua,World Of Warcraft,我完全不熟悉LUA脚本,尝试创建一个表,其中包含一个接一个接收到的数据,然后在同一个函数中使用它来输出收集到的数据 function PremadeFrame_OnEvent(self, event, arg1, arg2) --start chat_msg_raid_leader if (event == "CHAT_MSG_RAID" or event == "CHAT_MSG_RAID_LEADER" ) then battlegrounds = {}; if st

我完全不熟悉LUA脚本,尝试创建一个表,其中包含一个接一个接收到的数据,然后在同一个函数中使用它来输出收集到的数据

function PremadeFrame_OnEvent(self, event, arg1, arg2)
  --start chat_msg_raid_leader
  if (event == "CHAT_MSG_RAID" or event == "CHAT_MSG_RAID_LEADER" ) then
    battlegrounds = {};
    if string.find(arg1,"BGNUMBER") then
      number = string.match(arg1,"%d+");
      battlegrounds[number] = "";
      battlegrounds[number] = battlegrounds[number]..","..arg2;
      for k,v in pairs(battlegrounds) do
      DEFAULT_CHAT_FRAME:AddMessage ("\124c0000FFFF[BG Number:"..k.."]"..v.."");
      end
    end
  end
end
我试图通过使用将数据添加到其他数据的末尾

battlegrounds[number] = battlegrounds[number]..","..arg2;
但它只输出一个接收到的数据,例如,第一个玩家的名字是斯卡里尔,其他人是约翰,马克斯,它从斯卡里尔,约翰,马克斯那里获取数据,但输出类似

[BG Number 43], Scarill
我希望它能像这样输出

[BG Number 43] Scarill, Max
[BG Number 54] John

我猜
predeframe\u OnEvent
是一个事件回调函数。每次呼叫时,新的
战场
表格都会在里面创建,所以很自然,里面只有一件物品。如果你想捕获比当前物品更多的物品,你需要在
predeframe\u OnEvent
外部设置
battlegrounds
,如下所示:

battlegrounds = {}

function PremadeFrame_OnEvent(self, event, arg1, arg2)
  --start chat_msg_raid_leader
  if (event == "CHAT_MSG_RAID" or event == "CHAT_MSG_RAID_LEADER" ) then
    if string.find(arg1,"BGNUMBER") then
      number = string.match(arg1,"%d+")
      battlegrounds[number] = arg2
      for k,v in pairs(battlegrounds) do
        DEFAULT_CHAT_FRAME:AddMessage ("\124c0000FFFF[BG Number:"..k.."]"..v.."")
      end
    end
  end
end

因此,不会每次在事件处理程序中重新创建该字符串。

每次调用事件处理程序时,都需要扩展该字符串:

local battlegrounds = {}

function PremadeFrame_OnEvent(self, event, arg1, arg2)
  --start chat_msg_raid_leader
  if (event == "CHAT_MSG_RAID" or event == "CHAT_MSG_RAID_LEADER" ) then
    if string.find(arg1,"BGNUMBER") then
      number = string.match(arg1,"%d+")
      if battlegrounds[number] == nil then
          battlegrounds[number] = arg2
      else
          battlegrounds[number] = battlegrounds[number] .. "," .. arg2
      end
      for k,v in ...
但是,如果可以使用相同的
arg1
arg2
多次调用
predeframe\u OnEvent()
,但您在字符串中重复了,那么您需要将战场[number]作为一个表,并且仅添加
arg2
(如果尚未在该表中)。示例(未测试,可能是语法错误):


风格说明:尽量使用
本地
除非需要全局

我一开始也这么想,因为我来自另一种脚本语言,当你声明函数之外的东西时,你必须使它全局或类似的东西。我照你说的做了,但现在又回来了empty@Sercankd我刚刚更新了代码(注意战场[number]=arg2),看看这是否会改变输出。我认为还有另一个问题,接收到的数据不是即时的,也不是同步的。我想收集是有问题的everything@Sercankd是的,如果没有更多的上下文信息,很难判断什么是错的。但至少你知道你的第一个方法是错误的。
local battlegrounds = {}

function PremadeFrame_OnEvent(self, event, arg1, arg2)
  --start chat_msg_raid_leader
  if (event == "CHAT_MSG_RAID" or event == "CHAT_MSG_RAID_LEADER" ) then
    if string.find(arg1,"BGNUMBER") then
      local number = string.match(arg1,"%d+")
      if battlegrounds[number] == nil then
          battlegrounds[number] = {[arg2] = 1} -- use hash map, will be easiest to search for arg2 later
      else
          -- only add arg2 if not already in there:
          local bgn = battlegrounds[number] 
          if bgn[arg2] == nil then
              table.insert(bgn, arg2)
          end
      end

      for k,v in pairs(battlegrounds) do
          local msg = "\124c0000FFFF[BG Number:" .. k .. "]" .. table.concat(v, ',')
          DEFAULT_CHAT_FRAME:AddMessage(msg)
      end
    end
  end
end