首页 > 解决方案 > 没有通过 ipairs 正确地迭代联系人

问题描述

我有以下代码:

local Enemy = Enemy
local g = {}

local contactList = {}
local groupChats = {L"Solo", L"Party", L"Warband"}
local chatPrefix = {L"/s", L"/p", L"/wb"}


local function getGroupType()
  if (IsWarBandActive()) then
    return 3
  end
  if (GetNumGroupmates() > 0) then
    return 2
  end 
  return 1
end

local function getChatPrefix()
  local gtype = getGroupType()
  return chatPrefix[gtype]
end

local function getChatType()
  local gtype = getGroupType()
  return groupChats[gtype]
end


local function getGroupNames()
  local names = {}
  local group = GetGroupData()
  for _, member in ipairs(group) do
    if (member.name ~= nil) then
      names[#names+1] = member.name
    end
  end
  return names
end

local function getWarbandNames()
  local names = {}
  local warband = GetBattlegroupMemberData()
  for _, party in ipairs(warband) do
    for a = 1, 6 do
      if (party.players[a] ~= nil) then
        if (party.players[a].name ~= Enemy.playerName) then
          names[#names+1] = party.players[a].name
        end
      end
    end
  end
  return names
end


function Enemy.getChatPrefix()
  return getChatPrefix()
end

function Enemy.IntercomInitialize ()
    
    Enemy.intercom = g
    g.queue = {}
  
  
  RegisterEventHandler(SystemData.Events.BATTLEGROUP_UPDATED, "Enemy.intercomGroupUpdated")
  RegisterEventHandler(SystemData.Events.GROUP_UPDATED, "Enemy.intercomGroupUpdated")
  RegisterEventHandler (SystemData.Events.GROUP_PLAYER_ADDED, "Enemy.intercomGroupUpdated")

    -- events
    Enemy.AddEventHandler ("Intercom", "ChatTextArrived", Enemy.Intercom_OnChatTextArrived) 
    Enemy.AddEventHandler ("Intercom", "BroadcastMessageAsk", Enemy.Intercom_OnBroadcastMessageAsk)
    Enemy.AddEventHandler ("Intercom", "BroadcastMessageInvite", Enemy.Intercom_OnBroadcastMessageInvite)
    

    if (Enemy.CanSendIntercomMessage ()) then
      --table.insert (data, L"You're currently in '"..g.name..L"' intercom channel with subId: '"..g.subId..L"'")
      table.insert (data, L"You're currently in intercom channel: '"..g.subId..L"'")
    else
      table.insert (data, L"You're currently not in any intercom channel.")
    end
        
    table.insert (data, L"Left-click to open intercom channel dialog.")
  end )
    
    
    Enemy.TriggerEvent ("IntercomInitialized")
end

function Enemy.intercomGroupUpdated()
  local gtype = getGroupType()
  --d(gtype)
  contactList = {}
  if (gtype == 2) then
    contactList = getGroupNames()
  elseif (gtype == 3) then
    contactList = getWarbandNames()
  end
  --d(contactList)
end

function Enemy.Intercom_OnChatTextArrived (t, from, text)
  local data = Enemy.Split(towstring(text), L":")
  if (text:find(L"EnemyAddon")) then
      local commandFlag = true
    -- .alert someone Scatterpack:Scatterpack:EnemyAddon:Mark:Neborhest Bat:N:474:
    --        address from       :subId      :EnemyAddon:command
    if (text:find(L":Ask:")) then
      Enemy.Intercom_OnBroadcastMessageAsk (data[2], data[1])
    end
    if (text:find(L":Invite:")) then
      Enemy.Intercom_OnBroadcastMessageInvite(L"", data[1], data[2])
    end
    if (data[2] == g.subId) then
      Enemy.TriggerEvent ("IntercomMessage"..Enemy.toString (data[4]), data[2], unpack (data, 5))
    end
  end
end


function Enemy.IntercomJoin (name, pChannel)
  g.name = pChannel
  g.subId = name
  
  g.isReady = true
  Enemy.UI_Icon_Switch (true)
  
  
  --Enemy.JoinChannel (g.name, function (name, channel, channelId)
  --[[
  Enemy.JoinChannel (name, function (name, channel, channelId)
    g.channel = channel
    g.channelId = channelId
    g.isReady = true
    Enemy.UI_Icon_Switch (true)
  end)
  ]]--
end

function Enemy.CanSendIntercomMessage ()
    return (g.isReady == true)
end

function Enemy.IntercomSendMessage (key, text)
  
    if (not Enemy.CanSendIntercomMessage ()) then return end
    g.queue[key] =
    {
        key = key,
        text = text,
        t = Enemy.time
    }
    local task_name = "intercom "..Enemy.toString (key)
    if (Enemy.GetTask (task_name) ~= nil) then return end
    
    Enemy.AddTaskAction (task_name, function ()
        
    local q = g.queue[key]
        
            -- abort if intercom not ready
    if (q == nil or not Enemy.CanSendIntercomMessage ()) then return true end
            
            -- wait if can't send chat message
    if (not Enemy.CanSendChatMessage ()) then return false end
            
            -- sending
    local text = q.text
    local sendText = L""
    if (type (text) == "function") then text = text () end
      local gtype = getGroupType()
      local data = Enemy.Split(text, L":")
      if (data[2] == L"Mark") then
        Enemy.TriggerEvent ("IntercomMessage"..Enemy.toString(data[2]), Enemy.playerName, unpack (data, 3))
      end
      --local testText = L".alert !someContact! "..Enemy.playerName..L":"..Enemy.toWString(g.subId)..L":"..Enemy.toWString (text)
      --d(testText)
      if (getGroupType() ~= 1) then
        for index, contact in ipairs(contactList) do
          sendText = L".alert "..Enemy.toWString(contact)..L" "..Enemy.playerName..L":"..Enemy.toWString(g.subId)..L":"..Enemy.toWString (text)
          SendChatText (sendText, L"")
    --d(sendText)
        end
      end
      g.queue[key] = nil
      return true

  end)
end

我的问题是在代码的最底部

for index, contact in ipairs(contactList) do 
sendText = L".alert "..Enemy.toWString(contact)..L" "..Enemy.playerName..L":"..Enemy.toWString(g.subId)..L":"..Enemy.toWString (text)
          SendChatText (sendText, L"")

contactList 似乎没有正确迭代。

在发出相关命令时,消息会正确发送,但仅发送给组中的另一个人,而不是一个接一个地发送给每个人。

预期的行为是发送消息以联系 [1]、联系 [2] 等。

我对为什么有点迷茫,我已经尝试过限制消息,因为我认为这可能是它只发送给一个的原因,但事实似乎并非如此。

标签: lua

解决方案


推荐阅读