1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Помогите Оптимизировать систему анти иксрея

Тема в разделе "Разработка плагинов для новичков", создана пользователем Абсик, 18 окт 2022.

  1. Автор темы
    Абсик

    Абсик Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Abcik
    Всем привет.
    Задумался над идеей создания "идеального" anti x-ray плагина. Но как известно, идеальных античитов потому и не существует, что они отнимают слишком много ресурсов и часто их использование иррационально, тем не менее, быть может у кого-то будут светлые идеи по существенной оптимизации или изменению моего метода, пусть даже незначительно жертвуя качеством вычислений, или наоборот улучшая...?

    И так, перейдём к сути метода и описанию его работы:

    1. Скрываем для игрока все руды в зоне досягаемости.
    (В окончательной версии предполагалась пакетная реализация детекта отправки чанков, но быстрее и проще было тестить на PlayerLoadChunkEvent) При отправке чанка игроку мы перебираем блоки в чанке и запоминаем локации всех скрытых руд и соответственно, пакетно заменяем эти блоки на камень.

    2. По КД проверяем, может ли игрок увидеть какие-то скрытые для него блоки.
    Здесь я решил взять 8 векторов, из каждой вершины блока к локации глаз игрока и если хоть на одном векторе не было препятствий(твёрдых непрозрачных блоков) - отправляем игроку настоящий блок, и вычеркиваем блок из скрытых.
    Как видно на картинке, бывают ситуации, когда руду видно не полностью, а лишь её часть, чаще всего это угол. И из-за этого было принято решение использовать 8 вершин куба.

    2022-10-18_18.10.16.png

    О проблемах:
    1. Бывают ситуации, где 8 вершин скрыты за блоками, но блок все-равно должен быть виден.
    2022-10-18_18.09.16.png
    2. Оптимизация.
    Данный метод при ~12 чанках прогрузки, на версии 1.19.2 занимает больше 5-ти секунд на просчёт для ОДНОГО игрока, что делает этот метод неюзабельным. Просчитывать приходилось более 200 000 руд, умножив на кол-во векторов, и затем на кол-во блоков между игроком и рудой становится понятно почему так долго. (Хотелось бы апдейт каждые 50мс, или хотя-бы каждые 250мс, для предотвращения ситуаций, что руда прогружается с запозданием прямо перед твоим лицом, или уже за твоей спиной.)

    PS.
    Естественно все вычисления проводятся в отдельном асинхронном потоке, но это не спасает ситуацию.
    Также преимущество этого метода заключается в том, что он способен маскировать вообще любой блок, а не только руды. (Сундуки, печки и т.д)
    Я знаю об существовании Orebfuscator, но мне не нравится метод его работы.

    Интересно почитать ваши мысли по этому поводу. Спасибо за внимание!
     
  2. imDaniX

    imDaniX Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    У stonar96 есть похожий ресурс - RayTraceAntiXray. Он же, кстати, занимается поддержкой анти-хрея у Бумаги.
     
  3. imDaniX

    imDaniX Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Для начала - я бы, если честно, не запаривался бы, и просто скрывал все руды при отсутствии света. Есть конечно пара моментов, вроде зелья ночного зрения, но это будет явно быстрее в плане обработки, и честнее по отношению к игрокам без динамичного освещения и fullbright(будь то чит, мод или просто сломанная настройка).


    Возвращаясь к топику... Для начала, конечно, нужно не обрабатывать что-либо за полем зрения игрока. То бишь, если там у игрока что-то за спиной, нет смысла гонять лучи. Я бы предполагал, что fov игрока 120гр, и топал уже оттуда. Будет лучше иметь некоторый универсальный метод для других углов обзора, чтоб можно было подкорректировать

    Далее - дальность. Ну за 12 чанков игрок вряд ли сможет отличить железную руду от камня без какого-нибудь приближения. В зависимости от расстояния можно пускать разное количество лучей, или в на каком-то расстоянии уже не пускать их вообще. На средней дистанции будет иметь смысл пускать лишь один луч.
    Единственное, в расчет стоит взять телескопы - если выйдет сделать обработку поля зрения из первого пункта, можно просто использовать там разные значения.

    Не стоит пускать лучи тогда, когда они не нужны. Игрок не может увидеть все 8 вершин разом - максимум 7, и это вычислить должно быть несложно. На втором скриншоте, не будь преграды, игрок мог бы видеть лишь 6 из 8, но тут уж придется об геометрию головой биться.

    По поводу виденья блока - сложный вопрос. Можно пускать луч в псвдорандомном месте блока.
     
  4. Автор темы
    Абсик

    Абсик Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Abcik
    О, интересно... Я так понимаю у него это работает в связке с paper engine-mode: 1, который берёт на себя около 75% всех руд, что в принципе само по себе уже облегчает работу плагину...
    Но больше интересно как он производит просчёты, буду смотреть, спасибо.
     
  5. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Ну на большой онлайн это не поставить, прожорливый очень. Обычный антииксрей просто смотрит по массиву освещения блоков ничего не нагружая.
     

Поделиться этой страницей