мда, вы хоть глянте код аддона... потом уже клевету разводите.
Сообщение от
Skiv
Зачем убирать алерты, которые отображаются только когда что-то идёт не так? И в чем заключается ваш способ исправления багофреймов? И почему он приводит к снятию с игрока статуса спектатора?
это не алерты когда что то идёт не так. это банальные вещи, которые не несут никакой смысловой информации для игрока.
способ исправления прост - я его уже пытался пару раз объяснить рамусику.
попробую объяснить и тут, чтобы развеять все сомнения и клевету со стороны некоторых в этом топике.
в аддоне есть функция Execute в которой есть
Код:
if (ATPlayers[target] == nil) then
ATPlayers[target] = CreatePlayer(target)
CreateFrameForPlayer(ATPlayers[target])
ForceUpdate()
end
тут происходит построение фреймов, и вызов функции апдейта всех фреймов.
фишка в том, что не правильно совмещать функцию апдейта сразу после построения, и пытатся постоянно вызывать на арене Execute с этим if для обновления фреймов. т.к. происходит именно тут наше забагивание спектаторов которые заходят посмотреть на арену - они все проходят через этот if и для них также прорисовывается фрейм UNNAMED.
что я сделал - я добавил флаг к этому ифу
Код:
if (ATPlayers[target] == nil and key == 0) then
ATPlayers[target] = CreatePlayer(target)
CreateFrameForPlayer(ATPlayers[target])
ForceUpdate()
end
этот флаг изменяется в нескольких местах:
Код:
local atime = 0
local zonetext
local function atUpdate(self,elapsed)
atime = atime + elapsed
if atime > ARENADELAY then
zonetext = GetMinimapZoneText()
if (zonetext ~= "Арена Награнда" or zonetext ~= "Арена Острогорья" or zonetext ~= "Арена Даларана" or zonetext ~= "Руины Лордерона") then
atime = 0
end
if (zonetext == "Арена Награнда" or zonetext == "Арена Острогорья" or zonetext == "Арена Даларана" or zonetext == "Руины Лордерона") then
key = 1
end
end
end
local framarena = CreateFrame("frame")
framarena:SetScript("OnUpdate", atUpdate)
вот тут, когда я по таймеру через каждые ARENADELAY секунд вызываю проверку зоны, где игрок находится, и если обнаруживается игрок на одной из арен - key становится равным 1 и if наш закрывается.
Arenadelay - время, которое посути есть у фреймов после захода на арену прорисоватся (у фреймов именно игроков команд на арене), да, существует вероятность что в это время Arenadelay может всё таки проскочить левый спектатор и фрейм UNNAMED но эта вероятность весьма маленькая. И если у вас быстрый комп - можно это значение уменьшать максимально, что позволит фактически исключить появление фреймов от спектаторов.
но, т.к. мы после того как зашли на арену - перекрыли if для всех, в том числе и перекрыли ForceUpdate() - нам надо его откуда то также постоянно вызывать. Для этого был создан таймер, который каждые 0.5 секунд вызывал это обновление
Код:
local key = 0
local total = 0
local count = -1
local function onUpdate(self,elapsed)
total = total + elapsed
if total >= 0.5 then --изменить на 0.5 если вновь появился баг с фреймами (рекомендуется от 0.5 до 2)
if (key == 1) then
ForceUpdate()
end
total = 0
end
end
local fram = CreateFrame("frame")
fram:SetScript("OnUpdate", onUpdate)
фишка в том, что когда игрок не на арене - всё нормально. но когда игрок заходит на аренку как спектатор - из-за фактически созданного спама этим таймером запросов на сервер, от сервера приходят сообщения что команда не может быть обработана. Да, можно увеличить время от 0.5 до 5 и спама не будет, однако будут созданы тогда моменты что фреймы на арене будут прогружатся до 5 секунд. А это не ок.
А когда ты играешь сам на арене (тоесть из-за проверки на зону игрока, и из-за того что игрока зона = какой то Арене) он пытается запускать ForceUpdate() но из-за того что игрок не спектатор, в чат лезут алерты You are not spectator!
весь этот спам подчищается теперь фильтром
Код:
local function myChatFilter(self, event, msg) --(self, event, msg, author, ...)
if msg:find("Teams:") then
atime = 0
isinarena = true
end
if msg:find("You are not spectator!") then
msg:hide();
key = 0
atime = 0
isinarena = false
end
if msg:find("Команда не может быть обработана в текущий момент. Попробуйте позже") then
msg:hide();
end
end
ChatFrame_AddMessageEventFilter("CHAT_MSG_SYSTEM", myChatFilter)
при этом переопределяется key чтобы заново можно было нормально зайти на аренку и спектаторить (чтобы он не застревал на значении 1).
Уважаемые разработчики, если у вас появится идея, как можно на уровне клиента ещё сделать проверку на отличие Игрок\Спектатор подскажите мне пожалуйста. Было бы хорошо отказатся от идеи с проверкой зоны игрока.
Я пытался использовать функцию http://wowpedia.org/API_IsActiveBattlefieldArena
Код:
isArena, isRegistered = IsActiveBattlefieldArena();
но она почему то не хотела работать ( Спасибо за внимание к проблеме. Всяких тролей которые вспомнили прошлое 4 года назад, прошу глянуть для начала код аддона, а потом молоть чушь своими языками.
- - - Updated - - -
Сообщение от
Фео
А вот не нужно на раритетной технике тестировать.
там не совсем раритетная.
обычный офисный комп