Конфликт фильтра кадров чата World-of-Warcraft

У меня есть скрипт WoW/LUA, который я пытаюсь запустить, но он конфликтует с надстройкой Stubby, которая, как мне кажется, является частью надстройки Auctioneer. Вот сообщение, которое я получаю:

Произошла ошибка: Stubby Count: 1 Сообщение: Ошибка: исходный вызов не удался после запуска перехватчиков для: ChatFrame_OnEvent Использование: SendChatMessage(текст [,тип] [,язык] [,targetPlayer]) Отладка:
(конечный вызов): ? [строка ":OnEvent"]:1: [строка ":OnEvent"]:1

Теперь единственное, что происходит в конфликтующем дополнении, это:

ChatFrame_AddMessageEventFilter("CHAT_MSG_PARTY", partyMsg)

Код внутри partyMsg также очень прост:

local function partyMsg(msg,author,language,lineID,senderGUID)
  if (store ~= msg) then
    SendChatMessage(msg,"SAY",nil,nil);
  end
  store = msg;
end

Эта ошибка связана с тем, что два аддона пытаются фильтровать фрейм чата? Если да, то как это можно сделать? Мне кажется странным, что у Blizzard такая простая, но важная концепция ограничивается одним аддоном.


person Serodis    schedule 19.08.2012    source источник


Ответы (2)


Кажется, я вижу, что здесь произошло.

Ссылка, которую вы использовали, Events/Communication, показывает только определенные параметры для конкретного события, независимо от контекста.

Контекст обычно является обработчиком OnEvent.

Функция ChatFrame_AddMessageEventFilter позволяет вам использовать обработчик OnEvent фрейма чата вместо вашего собственного для событий фрейма чата и имеет четко определенные параметры. для фильтров, которые вы добавляете.

Обработчик OnEvent может выглядеть так:

function Foo_OnEvent(self, event, ...)

Фильтр ChatFrame должен выглядеть следующим образом для первых двух параметров:

function Foo_ChatFrameFilter(self, event, msg, ...)

Фильтр ChatFrame специфичен. Однако для OnEvent вы можете создать «обработчик» Lua, который не заботится о том, из какого кадра он пришел:

<OnEvent>
    MyEventHandler(event, ...)
</OnEvent>
person Celess    schedule 20.08.2012

Для полноты я включу весь исходный код этого аддона:

local function partyMsg(someTable,msgType,msg,user,language,...)
  if (store ~= msg) then
      SendChatMessage(user .. " just said: ".. msg .. " using that sneaky " .. language .. " language.");
  end
  store = msg;
  return false;
end

ChatFrame_AddMessageEventFilter("CHAT_MSG_PARTY", partyMsg)
ChatFrame_AddMessageEventFilter("CHAT_MSG_PARTY_LEADER",partyMsg)

Было несколько проблем с исходным кодом:

1) Я использовал WoWWiki для получения информации и, во-первых, неправильно ее прочитал. lineID и senderGUID не являются 4-м и 5-м аргументами. Затем, помимо этого, WoWWiki вообще некорректен на этой странице. Правильные аргументы указаны выше в источнике. Первый аргумент, таблица, я не уверен в ее назначении. В любом случае, этот код теперь работает полноценно.

person Serodis    schedule 19.08.2012
comment
Для функции фильтра параметр «я» или «таблица» является ссылкой на фактический объект фрейма чата или саму таблицу, чтобы фильтр имел контекст. И синтаксис, и пример показывают это, но строка синтаксиса называет его «chatFrame», а пример называет его «я», поскольку «я» является традиционным для неявного параметра Lua «синтатический сахар», если вы должны были поместить и использовать такая же функция в реальной таблице фреймов чата. Оба они верны в документации WoWWiki. Страница замусорена примечаниями об изменениях API и немного сбивает с толку, особенно если вы не знакомы с семантикой Lua. - person Celess; 20.08.2012
comment
Я имею в виду wowwiki.com/API_ChatFrame_AddMessageEventFilter на тот случай, если вы видели его в другом месте, а может и не правильный. - person Celess; 20.08.2012