Правила форума Гаранты форума
Размещение рекламы AMX-X компилятор

Здравствуйте, гость Вход | Регистрация

Наши новости:

14-дек
24-апр
10-апр
11-апр

Баг каналов hud'ов в statsx

, Attackers/Victims info
Статус пользователя Yaroslav
сообщение 11.8.2013, 12:04
Сообщение #1


Стаж: 12 лет

Сообщений: 296
Благодарностей: 247
Полезность: 1084

Столкнулся с вроде донельзя элементарной проблемой.
При установке значений показа Attackers/Victims в statsx худы пропадают слишком быстро, не соблюдая заданное значение в HUD_DURATION, равное 12 секунд.
Думаю, перекрываются каналы. Выставил на все каналы в statx значение channel равное -1. Ноль эффекта.
Float:holdtime берется из квары HUD_DURATION.

Блок показа расчета показа худов:
Скрытый текст

Код:

// Show round end stats. If gametime is zero then use default duration time.
show_roundend_hudstats(id, Float:fGameTime)
{
// Bail out if there no HUD stats should be shown
// for this player or end round stats not created.
if (!g_izStatsSwitch[id]) return
if (!g_sAwardAndScore[0]) return

// If round end timer is zero clear round end stats.
if (g_fShowStatsTime == 0.0)
{
ClearSyncHud(id, g_HudSync_EndRound)
#if defined STATSX_DEBUG
log_amx("Clear round end HUD stats for #%d", id)
#endif
}

// Set HUD-duration to default or remaining time.
new Float:fDuration

if (fGameTime == 0.0)
fDuration = g_fHUDDuration
else
{
fDuration = g_fShowStatsTime + g_fHUDDuration - fGameTime

if (fDuration > g_fFreezeTime + g_fFreezeLimitTime)
fDuration = g_fFreezeTime + g_fFreezeLimitTime
}

// Show stats only if more time left than coded minimum.
if (fDuration >= HUD_MIN_DURATION)
{
set_hudtype_endround(fDuration)
ShowSyncHudMsg(id, g_HudSync_EndRound, "%s", g_sAwardAndScore)
#if defined STATSX_DEBUG
log_amx("Show %1.2fs round end HUD stats for #%d", fDuration, id)
#endif
}
}

// Show round end stats.
show_user_hudstats(id, Float:fGameTime)
{
// Bail out if there no HUD stats should be shown
// for this player or user stats timer is zero.
if (!g_izStatsSwitch[id]) return
if (g_fzShowUserStatsTime[id] == 0.0) return

// Set HUD-duration to default or remaining time.
new Float:fDuration

if (fGameTime == 0.0)
fDuration = g_fHUDDuration
else
{
fDuration = g_fzShowUserStatsTime[id] + g_fHUDDuration - fGameTime

if (fDuration > g_fFreezeTime + g_fFreezeLimitTime)
fDuration = g_fFreezeTime + g_fFreezeLimitTime
}

// Show stats only if more time left than coded minimum.
if (fDuration >= HUD_MIN_DURATION)
{
if (ShowKiller)
{
new iKiller

iKiller = g_izKilled[id][KILLED_KILLER_ID]
get_kill_info(id, iKiller, g_sBuffer)
add_attacker_hits(id, iKiller, g_sBuffer)
set_hudtype_killer(fDuration)
show_hudmessage(id, "%s", g_sBuffer)
#if defined STATSX_DEBUG
log_amx("Show %1.2fs %suser HUD k-stats for #%d", fDuration, g_sBuffer[0] ? "" : "no ", id)
#endif
}

if (ShowVictims)
{
get_victims(id, g_sBuffer)
set_hudtype_victim(fDuration)
show_hudmessage(id, "%s", g_sBuffer)
#if defined STATSX_DEBUG
log_amx("Show %1.2fs %suser HUD v-stats for #%d", fDuration, g_sBuffer[0] ? "" : "no ", id)
#endif
}

if (ShowAttackers)
{
get_attackers(id, g_sBuffer)
set_hudtype_attacker(fDuration)
show_hudmessage(id, "%s", g_sBuffer)
#if defined STATSX_DEBUG
log_amx("Show %1.2fs %suser HUD a-stats for #%d", fDuration, g_sBuffer[0] ? "" : "no ", id)
#endif
}
}
}




Переизбытка худов или наложения каналов другими плагинами нет. Единственное. что есть, это:

Скрытый текст

Код:

formatex(infohud, 191, "Текущая карта: %s^nОсталось времени: %i:%i^nСледующая карта: %s", map, timeleft_minutes, timeleft_seconds, nextmap)
set_hudmessage(0,255,0,0.7,0.01,0, 1.0, 1.0, 0.1, 0.2, -1)
show_hudmessage(0, infohud)
...
set_task(1.0, "show_time",122,"",0,"b")



Подскажите, в чем может быть проблема?
Может быть есть модифицированные statx без хардкода?
На всякий случай, прикреплю sma.
Прикрепленный файл  statsx.zip ( 10,84 килобайт ) Кол-во скачиваний: 0


Отредактировал: Yaroslav, - 11.8.2013, 12:11
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   Цитировать сообщение
Safety1st
сообщение 11.8.2013, 15:41
Сообщение #2
Стаж: 14 лет
Город: Moscow

Сообщений: 7228
Благодарностей: 8071
Полезность: 196

Думаю, проблема в том, что на повторяющиеся многократно задачи best practice - не ставить автоканал. Я бы его поставил на 1-й: у меня 4-й имеет наивысший приоритет, потому что в плагинах он реже всего используется.
--

1 секунда? Бедные твои заспамленные игроки)
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя Fred Perry
сообщение 11.8.2013, 15:44
Сообщение #3


Иконка группы

Стаж: 16 лет

Сообщений: 6594
Благодарностей: 2370
Полезность: 813

Цитата(Safety1st @ 11.8.2013, 16:41) *
Думаю, проблема в том, что на повторяющиеся многократно задачи best practice - не ставить автоканал. Я бы его поставил на 1-й: у меня 4-й имеет наивысший приоритет, потому что в плагинах он реже всего используется.
--

1 секунда? Бедные твои заспамленные игроки)

У меня 0.1 стоит и ничего :-)


Гнилой фашистской нечисти
Загоним пулю в лоб,
Отродью человечества
Сколотим крепкий гроб!
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Safety1st
сообщение 11.8.2013, 15:51
Сообщение #4
Стаж: 14 лет
Город: Moscow

Сообщений: 7228
Благодарностей: 8071
Полезность: 196

Цитата(Fred Perry @ 11.8.2013, 17:44) *
У меня 0.1 стоит и ничего :-)

Ты ещё обоснуй, что так и правильно ;)
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Yaroslav
сообщение 11.8.2013, 16:43
Сообщение #5


Стаж: 12 лет

Сообщений: 296
Благодарностей: 247
Полезность: 1084

Цитата(Safety1st @ 11.8.2013, 17:41) *
Думаю, проблема в том, что на повторяющиеся многократно задачи best practice - не ставить автоканал. Я бы его поставил на 1-й: у меня 4-й имеет наивысший приоритет, потому что в плагинах он реже всего используется.

Спасибо большое за совет, потестирую.

Цитата(Safety1st @ 11.8.2013, 17:41) *
1 секунда? Бедные твои заспамленные игроки)

Да-да, я все понимаю :) Весь вопрос в юзабилити / надо чем-то жертвовать :)
Но на практике нагрузка не так велика, хотя конечно может быть имеет смысл убрать секунды, продлить показ худа до минуты и ставить задачу раз в минуту.
Но встает вопрос с правильным remove_task и багом с наложением худов при этом.

Отредактировал: Yaroslav, - 11.8.2013, 16:47
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Safety1st
сообщение 11.8.2013, 16:57
Сообщение #6
Стаж: 14 лет
Город: Moscow

Сообщений: 7228
Благодарностей: 8071
Полезность: 196

Цитата(Yaroslav @ 11.8.2013, 18:43) *
Но на практике нагрузка не так велика
Тут дело не в нагрузке. Лишние же действия?

Цитата(Yaroslav @ 11.8.2013, 18:43) *
хотя конечно может быть имеет смысл убрать секунды, продлить показ худа до минуты и ставить задачу раз в минуту.
Но встает вопрос с правильным remove_task и багом с наложением худов при этом.
Минута - много. Хотя можно использовать DHUD)
Багов с наложением не будет, если жёстко задать канал: при выводе следующего предыдущее само исчезает.
Про remove_task ничего не известно из вашего кода, не подскажу.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя Yaroslav
сообщение 11.8.2013, 17:01
Сообщение #7


Стаж: 12 лет

Сообщений: 296
Благодарностей: 247
Полезность: 1084

Цитата(Safety1st @ 11.8.2013, 18:57) *
Лишние же действия?


Конечно лишние. Да код самый обычный, переделал самую малость:

Скрытый текст

Код:

#include <amxmodx>


public show_time(){

new timeleft_minutes
new timeleft_seconds
new nextmap[31]
new map[33]
timeleft_minutes = get_timeleft()/60
timeleft_seconds = get_timeleft()%60

get_cvar_string("amx_nextmap",nextmap,31)
get_mapname(map,32)

new infohud[192]
formatex(infohud, 191, "Текущая карта: %s^nОсталось времени: %i:%i^nСледующая карта: %s", map, timeleft_minutes, timeleft_seconds, nextmap)
set_hudmessage(0,255,0,0.7,0.01,0, 1.0, 1.0, 0.1, 0.2, 1)
show_hudmessage(0, infohud)
return PLUGIN_CONTINUE
}

public plugin_init()
{
register_plugin("ShowTime","1.0","Sif0n")
set_task(1.0, "show_time",122,"",0,"b")
return PLUGIN_CONTINUE
}



Отредактировал: Yaroslav, - 11.8.2013, 17:01
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Safety1st
сообщение 11.8.2013, 17:39
Сообщение #8
Стаж: 14 лет
Город: Moscow

Сообщений: 7228
Благодарностей: 8071
Полезность: 196

Тут вроде remove_task и не предполагается)
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя Yaroslav
сообщение 11.8.2013, 18:27
Сообщение #9


Стаж: 12 лет

Сообщений: 296
Благодарностей: 247
Полезность: 1084

Цитата(Safety1st @ 11.8.2013, 19:39) *
Тут вроде remove_task и не предполагается)

Ага, оно предполагается у меня в голове, как найдется время для латания этой дырки :))
...
Update: Выставление канала в 1 решило проблему, практика показала правильно :)
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Yaroslav
сообщение 12.8.2013, 20:26
Сообщение #10


Стаж: 12 лет

Сообщений: 296
Благодарностей: 247
Полезность: 1084

Снова дошли руки до худов. Перелопатил все плагины на каналы, большинство недочетов закрыл.
Увидел интересный нюанс statsx:
Худы - Attakers: blablabla Victims: blablabla могут показываться вместе, может показываться только худ Attackers, может только худ Victims. (визуально зависимость показа не установил)
И вспомнил, что данный баг уже визуально видел на других серверах.
Значит ошибка в алгоритме вывода данных худов в исходнике в первом посте темы.
Решения не нашел пока.

Отредактировал: Yaroslav, - 12.8.2013, 20:28
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Safety1st
сообщение 12.8.2013, 21:42
Сообщение #11
Стаж: 14 лет
Город: Moscow

Сообщений: 7228
Благодарностей: 8071
Полезность: 196

Ну или всё-таки в нативах AMXX ;)
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя Yaroslav
сообщение 13.8.2013, 11:21
Сообщение #12


Стаж: 12 лет

Сообщений: 296
Благодарностей: 247
Полезность: 1084

Safety1st, спасибо большое за твои посты на форуме.
Большинство проблем, где ты отписываешься, решается после твоих советов :)
Подскажи, если не затруднит. Нашел ли ты для себя решение данного вопроса?

Заранее благодарен за ответ.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Safety1st
сообщение 13.8.2013, 13:25
Сообщение #13
Стаж: 14 лет
Город: Moscow

Сообщений: 7228
Благодарностей: 8071
Полезность: 196

У меня HUD'ы Attackers/Victims не выводятся, потому и с проблемой не сталкивался.
А так-то да, с несколькими HUD'ами одновременно проблема может быть. Обойти или решить можно установкой каналов принудительно, использованием ShowSyncHudMsg() или DHUD'а. Советую поэкспериментировать ;) И ещё не забывайте, что все HUD'ы очищаются при спавне игрока.

И ещё можно попробовать поэкспериментировать с cvar'ами:
Код
amx_statsx_duration
amx_statsx_freeze


Отредактировал: Safety1st, - 13.8.2013, 13:26
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя Yaroslav
сообщение 14.8.2013, 16:43
Сообщение #14


Стаж: 12 лет

Сообщений: 296
Благодарностей: 247
Полезность: 1084

Итак, я их победил, путь был не легким и мне уже покалось, что я во тьме алгоритмов синхронизации худов,
но мне помогли два совета Safety1st'a, которые я взял за базис - принудительные каналы и работа с SyncHud.
Чтобы увидеть свет в конце тоннеля, нужно забыть как страшный сон мануал одного, известного и тут, модератора форума у Веста и обратить свой взор к плагин апроверу оленей Алке
и нормальному описанию натива SyncHudMessage в 5 строк.

Далее, взять его замечательный плагин с очередями SyncHud'ов, составить себе ТЗ по всем показам худов у вас на сервере и принудительно выставить им каналы с учетом приоритета во всех своих плагинах.
Какие худы у вас отображаются это дело индивидуальное, но, если у вас показывается (помимо прочего) сообщения miscstats'a - остался один vz столько то человек, то обязательно принудительно задайте канал в miscstats на наименее приоритетный. Прочие сообщения - по аналогии.

И что в итоге? В итоге у нас 0 худов перекрываются и мы используем 4 канала в несколько очередей. Юзер с переполнением канала, как при использовании dhud'a не вылетает.
Удачи в фиксах, друзья, я надеюсь мои мытарства вам помогут решить свои проблемы.

Отредактировал: Yaroslav, - 14.8.2013, 16:51
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
  Ответить в данную темуНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: