Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Помогите Как сделать чтобы хитбоксы были связаны между собой?

VladNotch

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
Frontalvlad
Мне нужно чтобы 3-4 энтити при передвижении моба (при телепорте игроком, при толкании из стороны в сторону) передвигались вместе с ним, как это сделано например с никнеймом. При том способ садить их друг на друга плохая идея, потому что при телепорте игроком, они могут друг с друга встать. Можно ли как-то это реализовать? По факту это должен быть энтити с несколькими хитбоксами.
 
Хитбоксы то client-side, их объединить нельзя.
Во всяком случае, ты можешь отслеживать эти телепорты и садить обратно.
Надписи над никами делают очень хитро, при отправке пакета перемещения игрока другим игрокам, отправляется ещё и перемещение стенда, поэтому для других игроков выглядит, будто надписи статичные с игроком. Можно, наверное, таким способом делать то, что ты хочешь.
 
Если ты на новых версиях, то можешь расширить хитбокс энтити с помощью Interaction.
 
Ого, это когда такую штуку добавили? Весьма полезный функционал
1.19.4 вроде бы.

Можно по подробнее пожалуйста?
В общем, Interaction — это такая энтитя, у которой регулируется размер. С помощью нехитрого шаманства и ковыряния можно закрепить её на любой энтите и «расширить» хитбокс. Это можно было сделать и раньше с помощью обычных невидимых арморстендов, но с Interaction это делать, в теории, гораздо удобнее. Вообще, советую почитать про дисплеи (item display, block display, text display). Тема новая, но многообещающая.
 
1.19.4 вроде бы.


В общем, Interaction — это такая энтитя, у которой регулируется размер. С помощью нехитрого шаманства и ковыряния можно закрепить её на любой энтите и «расширить» хитбокс. Это можно было сделать и раньше с помощью обычных невидимых арморстендов, но с Interaction это делать, в теории, гораздо удобнее. Вообще, советую почитать про дисплеи (item display, block display, text display). Тема новая, но многообещающая.
Мне даже интересно, с помощью какого нехитрого шаманства и ковыряния можно ее закрепить к любому энтити? Если его нужно садить через passanger, то есть ли в этом смысл?
 
Мне даже интересно, с помощью какого нехитрого шаманства и ковыряния можно ее закрепить к любому энтити? Если его нужно садить через passanger, то есть ли в этом смысл?
Ну да, а как ещё. Мы ж под баккит костыли пишем.
 
Ну да, а как ещё. Мы ж под баккит костыли пишем.
А можно сделать чтобы он мог сидеть на одном энтити, но при этом имел какое-то отклонение? То есть не сидел именно на голове, а где-нибудь справа от него.
 
А можно сделать чтобы он мог сидеть на одном энтити, но при этом имел какое-то отклонение? То есть не сидел именно на голове, а где-нибудь справа от него.
Извини, не знаю. Погуглил про оффсеты пассажиров и немного про плагины, где можно кататься на эндер-драконе, но готового решения не нашёл. Истина где-то рядом.
 
Извини, не знаю. Погуглил про оффсеты пассажиров и немного про плагины, где можно кататься на эндер-драконе, но готового решения не нашёл. Истина где-то рядом.
Так оффсеты пассажиров по идее захардкожены на клиенте. Или я ошибаюсь?
 
Это значит придется прибегнуть к NMS?
Хитбоксы на клиенте, то никакими пакетами их не изменить. В протоколе не нашёл упоминаний hitbox'ов или boundingbox'ов.
Но выше ещё шла речь про сущность Interaction, которую добавили в 1.19.4. Вот ей уже можно менять размеры даже средствами апи: https://jd.papermc.io/paper/1.19/org/bukkit/entity/Interaction.html
 
Хитбоксы на клиенте, то никакими пакетами их не изменить. В протоколе не нашёл упоминаний hitbox'ов или boundingbox'ов.
Но выше ещё шла речь про сущность Interaction, которую добавили в 1.19.4. Вот ей уже можно менять размеры даже средствами апи: https://jd.papermc.io/paper/1.19/org/bukkit/entity/Interaction.html
Другой вопрос, имеют ли они такой же функционал, как у арморстенда? Да и мне не размеры нужны, а все таки именно оффсет, чтобы делать смещение головы.
 
Другой вопрос, имеют ли они такой же функционал, как у арморстенда? Да и мне не размеры нужны, а все таки именно оффсет, чтобы делать смещение головы.
Ну если оффсеты, то простых путей тут нет. Либо моды, либо шейдеры. Ваниль сейчас поддерживает шейдеры, однако там не bukkit api, да и вообще не java. Стоит ли оно того...

Если не завязываться на механику посадки сущностей друг на друга, то можно перемещать одну сущность за другой без задержки - фактически просто телепортировать. Но на уровне апи будет задержка в 1 тик. Если нужно совсем без задержки, то можно действительно пакетами.

Расскажи, какая конечная задача, возможно предложим ещё какое-то решение
 
Расскажи, какая конечная задача, возможно предложим ещё какое-то решение
Есть n-ое количество арморстендов, которые должны всегда следовать за одним неподвижным слизнем. При том, этого слизня можно будет толкать или, сломав под ним блоки, уронить. Также при необходимости телепортировать через minecraft:tp. Все эти арморстенды должны быть привязаны к этому слизню, чтобы они всегда следовали за ним, и у каждого арморстенда должно быть определенное отклонение, указанное в конфигурации.

фактически просто телепортировать
До последнего откладывал эту идею, думал что найдется вариант легче и более адекватнее. Но кажется, мне и в правду придется его пересмотреть.
 
Ну. Тебе так или иначе придётся прибегнуть к использованию NMS (а чего тут страшного, кстати, когда есть ремаппер и возможность кодить под чистый код, а не обфускат?), ведь апи для таких целей отсутствует. Но мы всё равно в выигрыше, ведь у Interaction не статический хитбокс и клиент всегда знает размер хитбокса конкретного Interaction. Думаю, там налажено общение через пакет обновления метадаты (или что-то типа того, это вообще дебри игры). Решение точно есть, но его надо придумать. Как Interaction будет вести себя при отрицательных значениях ширины и высоты хитбокса? Можно ли изменить координаты пассажира через рефлексию, обойдя все методы и проверки баккита? Как именно сервер определяет, что энтити является пассажиром и что нужно менять её локацию, когда основная энтитя двигается? Нестандартные проблемы требуют нестандартных решений. Можно только пожелать удачи.
 
Другой вопрос, насколько это будет вызывать лаги? Таких энтити может быть очень много, штук 200-400
Если все вычисления и симуляции выкинуть в другой тред и не дёргать функцию телепортации по 20 раз за тик, то, думаю, всё будет работать нормально.

Добавлю, что по-хорошему эти твои энтити не должны тикаться (т. е. никаких проверок коллизий, гравитации, ИИ и т. п.), но я не знаю, можно ли реализовать это плагином. В бумажке точно есть функция отключения тика для арморстэндов (armor-stand-ticks), можешь глянуть её реализацию.
 
Последнее редактирование:
Если все вычисления и симуляции выкинуть в другой тред и не дёргать функцию телепортации по 20 раз за тик, то, думаю, всё будет работать нормально.

Добавлю, что по-хорошему эти твои энтити не должны тикаться (т. е. никаких проверок коллизий, гравитации, ИИ и т. п.), но я не знаю, можно ли реализовать это плагином. В бумажке точно есть функция отключения тика для арморстэндов (armor-stand-ticks), можешь глянуть её реализацию.
А есть ли какой-нибудь альтернативный способ, например проверять любое перемещение главного хитбокса, и вызывать уже этот метод телепортации?
 

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

Назад
Верх