мда, вы хоть глянте код аддона... потом уже клевету разводите.

Цитата Сообщение от 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 - - -

Цитата Сообщение от Фео Посмотреть сообщение
А вот не нужно на раритетной технике тестировать.
там не совсем раритетная.

обычный офисный комп