1. Ifoundavoice
2. 24.08.2018
3. Warden Anticheat
4. Warden Anticheat Violation: Lua Unlocker (CheckId: 800)
5. Обстоятельства >
6. --- >
Обстоятельства:
Бан на месяц. Некритично, но все-таки, чтобы разобраться в ситуации и просто поделиться опытом, думаю, будет полезно для других игроков, которые занимаются написанием своих аддонов (LUA / WOWAPI).
На определенном персонаже (выше) со следующим набором аддонов:
включенные аддоны
Atlas
Atlas_Transportation
Atlas_DungeonLocs
Bartender4
BulkMail2Inbox
ButtonFacade
ClassIcons
Doom_CooldownPulse
Gatherer
Gatherer_HUD
Ace3
MoveAnything
NeedToKnow
OmniCC
OneBag3
OneBank3
Postal
PowerAuras
SexyMap
SlideBar
SDM
!Swatter
!MoncaiCompare
+ 1 мой
[свернуть]
...в произвольное время (зависимость не найдена, с виду случайным образом) начала появляться ошибка LUA с информированием о том, что функция TargetNearest не может быть вызвана аддоном. Зная, что функция TargetNearest в принципе может вызываться только интерфейсом Blizzard (точнее вызываться то может, а исполняться нет) и не найдя зависимости с установленными аддонами, предположил, что возможно она может понадобиться разве что в Gatherer и то с большой натяжкой.
Сделал поиск по тексту значения 'TargetNearest' в папке Interface\AddOns и с удивлением не обнаружил ни единой записи. Что в принципе означает, что не один из аддонов в коде не использовал эту функцию. И я до сих пор не знаю что именно вызывало эту ошибку LUA.
Мне не хотелось отключать аддоны по-одному, так как это просто неэффективно из-за спонтанности возникновения данной ошибки (могла появиться через час игры, могла через 5 минут, а могла и не появиться вовсе). Поэтому, владея LUA и опытом написания аддонов я решил: Так как в коде самой ошибки не пишется, каким именно аддоном она вызвана, поэтому я просто перепишу функцию TargetNearest, а конкретно сделаю обертку над ней. Что я и сделал, добавив в свой аддон следующий код:
Код:
local origTargetNearest = TargetNearest
TargetNearest = function(...)
DEFAULT_CHAT_FRAME:AddMessage("TargetNearest is called", 1.0, 0.0, 0.0);
DEFAULT_CHAT_FRAME:AddMessage(debug.traceback(), 1.0, 0.0, 0.0);
origTargetNearest(...)
end
Что должен делать этот код:
1. Сохранять ссылку на оригинальную функцию TargetNearest.
2. Присваивать функции TargetNearest новую, мою функцию.
3. Вызывать мою функцию каждый раз, когда происходит вызов функции TargetNearest.
4. Что делает моя функция:
- Выводит красным цветом, что "TargetNearest вызвана"
- Выводит красным цветом полную цепочку вызова функции (код: debug.traceback()). В программировании это называется stack trace, с помощью которого я бы мог проследить в каком точно месте возникает данная ошибка.
5. Вызывать оригинальную функцию TargetNearest.
Вот собственно и все. После обновления моего аддона и перегрузки интерфейса (/reload) меня выкидывает.
--------------
После прочтения FAQ и захода в личный кабинет я обнаружил причину:
"Warden Anticheat Violation: Lua Unlocker (CheckId: 800) (забанил Warden Anticheat)"
Загуглил, что такое Lua Unlocker. Это программа, которая разблокирует защищенные функции WoW API, которые могут использоваться только интерфейсом Blizzard.
Я понимаю, почему сработал Warden Anticheat. Судя по всему, по триггеру 800 (CheckId: 800). Хоть это и ложное срабатывание в данном случае, но фраза "лучше перебдеть, чем недобдеть" в данном случае весьма уместна. Но, на всякий случай, если Warden все-таки сохраняет в логах файл с кодом, на которые срабатывают триггеры, вот номер строки, на которой находится код в файле в качестве подтверждения его безобидности: 73.
Я также понимаю, что вряд ли с этим будут разбираться ГМ, так как забанил Warden и не у всех есть знания в программировании.
Своей вины я не признаю. Потому что, я, как игрок, пользовался возможностями, которые предоставлены клиентом. Написание оберток вокруг стандартных функций WOWAPI является обычной практикой в написании аддонов. В данном случае, чтобы избежать бана, мне, как игроку, требовалось знать технические принципы работы античита Warden, чего естественно я знать не мог. С моральной точки зрения, считаю, что предупреждения было бы достаточно (не от Warden конечно, который банит по внесенным правилам автоматически, а от одного из ГМ, возможно, после разрешения ситуации).
Поэтому, пусть это история просто послужит опытом для других: Не писать обертки вокруг защищенных функций (Protected Functions), на них срабатывает Warden.