Зависание баффов на 0

blodden

Знаменитый
Участник
Сообщения
44
Розыгрыши
0
Решения
1
Репутация
16
Реакции
13
Баллы
1 298
Всем привет, ребят кто сможет подсказать в чем проблема ?
Когда баффы заканчиваются то висят на 0 это бывает редко но случается, приходится перезаходить игру и тогда все нормально.
Хде копать не подскажите ?
 
скорее всего таймер бафа перескакивает в минус и поэтому зависание. Страдали от такой проблемы со станом. Копай обработку эффектов в стадии финиша
 
Ну хорошо гляну, а то уже подозрения на патч может какая та dll кривая
 
Ну хорошо гляну, а то уже подозрения на патч может какая та dll кривая
ну в идеале вообще когда есть подозрения на патчи , ставить полностью чистые без каких либо дополнений, так и будет понятно в сервере дело или же в клиенте. бывают редкие конечно исключения что может ориг клиент иметь косяки но это крайне редко бывает.
 
Да уже попробовал чистый патч и с НКсофта тоже самое.
 
Только у вас или у всех игроков на сервере? На Овере (сборке) такая проблема на многих серверах встречалась, там у всего сервера уходили эффекты в 0 (становились бесконечными), помогал только релог сервака. Решение проблемы не знаю, но очевидно оно в сервере.
 
нее, у всех игроков такая проблема, но редко встречаемая.
 
У нас такое бывало тоже когда-то - причина была в забивании пула менеджера эффектов (EffectTaskManager в овере), т.е. проще говоря таски обработки работы эффектов (наложение/тики/снятие) не успевали вовремя отрабатывать и возникали такие "зависания" эффектов.
Решить можно например увеличением количества инстансов этих менеджеров, т.е. проще говоря раскидыванием запихивания задач эффектов на несколько параллельно работающих менеджеров.
Но сильно с количеством опять же не стоит увлекаться - можно сделать еще хуже. Вобщем зависит все от количества имеющихся ядер проца и всего такого.

Еще посоветовал бы поизучать, если есть, вещи типа нубобафферов и т.п. А то во многих сборках нет ограничения по времени на повторные запросы баффа, что позволяет зафлудить сервер запросами на этот самый бафф, что так же может легко и быстро забить очередь этих самых менеджеров и вызвать ту же самую проблему у всех. По крайней мере в оригинальном фениксе/овере таких проверок нет, нсколько я помню. Да и многие когда пишут те же бафферы в коммнуке и т.п. на эту тему не заморачиваются. А ведь это такой простой путь для вот такого своеобразного ддоса сервера...

К примеру у нас когда-то, еще на фениксе, когда я еще не добавлял этих проверок, именно так вызвали данный косяк - тупо зафлуживали серв через нубобаффера запросами на бафф с вполне понятным результатом. С тех пор взял за правило втыкать во все подобные вещи обязательную проверку типа "с момента предыдущего запроса этого игрока не прошло N миллисекунд - он идет нафиг со своим запросом".
 
Последнее редактирование:
Вроде как у фениксов есть же базовый лимит на запрос ко всем байпассам вроде он там равен 100 или 200 мс.
А вот у оверов, да подобной проверки нет. Лучше глобально такие проверки ставить, в каждый скрипт впиливать проверки это слишком сурово
 
ну 100 мс на байпассы это один фиг мало, т.к. просто посложнее будет процесс флуда - больше персов на ботах подключать придется
в подобных местах вобще разумно втыкать антифлуд хотя бы на 1-2 секунды, все равно вряд ли обычному игроку потребуется сразу же повторно запросить набор баффов.
 
Если тачка норм и обработчик бс в ядре норм, то 100 мс в целом то за глаза, но да на такие важные места можно и исключения сделать). В целом общую проверку обязательно нужно иметь в ядре. Потому как в тех же оверах уязвимых мест на эту тему просто уйма, нубо-баф фикс - это хорошо, а там еще есть вкусные циклы на парс манора в замках, им можно задачник у**ать минуты за 2 в 1 окно ну или те же нпсы в кхшках)
 
Еще кстати стоит проверить, вдруг есть где мобы/нпс которые из-за какой нибудь ошибки непрерывно на себя или других нпс рекаст каких-то баффов делают - тоже может к такому привести по идее, особенно если эти баффы с нулевым временем каста и без реюза.
 
Человек дело говорит. По сути это делается так:
Java:
  private static boolean checkReuse(Player player, String displayName)
  {
    if(player.isSharedGroupDisabled(Buffer.SHARED_REUSE_GROUP))
    {
      player.sendPacket(new SystemMessage(SystemMessage.S1_IS_NOT_AVAILABLE_AT_THIS_TIME_BEING_PREPARED_FOR_REUSE).addString(displayName));
      return false;
    }
    TimeStamp timeStamp = new TimeStamp(Buffer.SHARED_REUSE_GROUP, System.currentTimeMillis() + Config.SOME_DELAY, Config.SOME_DELAY);
    player.addSharedGroupReuse(Buffer.SHARED_REUSE_GROUP, timeStamp);
    return true;
  }
и уже в doBuff делаем проверочку checkReuse
 
Реакции: kick
Ну у меня чуток по другому - просто в сессионные переменные кладу реюз и проверяю там же.
Сессионные - по сути полный аналог обычных переменных персонажа из character_variables, просто без сохранения в бд, т.е. хранятся только в памяти, пока игрок в онлайне.
Java:
    /**
     * Устанавливает время следующего использования заданного действия
     *
     * @param action    - название действия
     * @param time        - время в мс
     */
    public void setNextActionUseTime(final String action, final long time)
    {
        _variables.setSessionVar(action, time);
    }

    /**
     * Возвращает время следующего использования заданного действия
     *
     * @param action    - название действия
     * @return        - время в мс
     */
    public long getNextActionUseTime(final String action)
    {
        return _variables.getSessionVar(action, 0L);
    }

    /**
     * Проверяет возможность следующего использования заданного действия
     *
     * @param action    - название действия
     * @param reuse        - если задано значение больше 0 и если уже есть возможность использовать - дополнительно будет выставлено время до следующего использования.
     * @return        - true - можно использовать, false - пока еще нет
     */
    public boolean checkNextActionUseTime(final String action, final long reuse)
    {
        if (getNextActionUseTime(action) > System.currentTimeMillis())
            return false;

        if (reuse > 0)
            setNextActionUseTime(action, System.currentTimeMillis() + reuse);

        return true;
    }
 
Ровно так же примерно и работает addSharedGroupReuse. Нет тут ни каких char_var и дрочение базы.
 
ну у меня сессионки просто так сказать большим функционалом обладают - я в них могу хранить что угодно, а не только тот же таймстамп как в шаредгроуп, т.е. данные вобще любого типа (включая любые производные от базового Object), так что и тут их задействовал как то что подходило под необходимый функционал.

З.Ы. у меня вобще сейчас аж 4 вида переменных имеются, подобных тем что в character_variables. Кроме них еще сессионные переменные, переменные общие на весь аккаунт, переменные для кланов
 
Последнее редактирование:
все, понял.

Манор вообще весь в эксплоитах, а через КХ можно ронять серваки - там вообще ядрёный эксплоит.
И если не секрет как ты х*лил в пару окон "задачник" манора ?
 
Вобще при желании многими пакетами можно "изнасиловать" большинство серверов, на почти любых сборках.
Для предотвращения этого надо впиливать нормальный антифлуд, в котором можно было бы задавать допустимые периоды запросов индивидуально для любых клиентских пакетов.
 
Ну с КХ там нет ничего сложного убить даже с 1 окна, а вот с манором интересно. Там вроде нет по реквесту ни какого парса, лист грузиться сразу, а запрос КЛа посевов отдаётся из базы и довольно аккуратно. Если конечно афтар не вбросил.