Получение атакующего игрока со стороны клиента

Версия Minecraft
1.12.2
API
Forge
Здравия желаю.
Мне нужно получить ник игрока, атакующего главного героя.
Сейчас у меня есть такой код:
Java:
@SubscribeEvent
    public static void CheckAttack(final LivingAttackEvent event){
        DamageSource source = event.getSource();
        Entity trueSource = source.getTrueSource();
     
        if (trueSource != null) sendLocalChatMessage(trueSource.toString());
        else sendLocalChatMessage("null");
    }

Если игрока бьёт другой игрок, в чат пишется null, то есть getTrueSource возвращает null.
Где-то я прочитал, что это из-за того, что с клиентской стороны нельзя в полной мере узнать всех деталей игрового процесса (или как-то так)
Можно ли вообще хоть как-то сделать то, что я задумал?

P.S. правда, этот код работает не только с игроком, но и с вообще любым мобом, но я проверял именно на игроке в "стерильных условиях" (в плоском мире без всего)
 
Последнее редактирование:

TheAndrey

Редактор учебника
1,071
72
372
Странно, что это событие вообще обрабатывается со стороны клиента. Весь урон обрабатывается исключительно со стороны сервера, клиенту нужен только минимум информации для показа анимаций.
 
Предлагаю обратить внимание на пакетную систему, она создана для передачи данных от сервера клиентам (и наоборот).
Проблема в том, что мод нужен исключительно для клиента, на сервер его поставить нельзя будет. Более того, он рассчитан на использование его, например, на играх вроде Bedwars'a, и разработчики сервера, конечно же, его ставить не будут.

Странно, что это событие вообще обрабатывается со стороны клиента. Весь урон обрабатывается исключительно со стороны сервера, клиенту нужен только минимум информации для показа анимаций.
Но мне не обязательно делать именно так, можно и другими способами
 
7,099
324
1,509
Так ведь ты сам как-то понимаешь, кто тебя бьет. Напиши ту же логику в моде
 
Так ведь ты сам как-то понимаешь, кто тебя бьет. Напиши ту же логику в моде
Тогда логика там будет заключаться в распознавании изображения на экране, для чего нужны относительно сложные нейросети, так что это вообще не вариант.
 
есть много разных способов, например если чел ударил и смотрит на тебя и ты получил урон
да, это можно проверить трассировкой луча, но проблема в том, что на игрока может смотреть несколько других игроков, и тогда непонятно, кто именно ударил
 
7,099
324
1,509
Тогда логика там будет заключаться в распознавании изображения на экране, для чего нужны относительно сложные нейросети, так что это вообще не вариант.
Тебе повезло: комп, на котором будет работать твой мод, уже знает всю необходимую инфу.
Клиент рендерит игроков вокруг, значит он знает их позицию и направление взгляда.
Клиент рендерит взмах руки другого игрока, значит, он знает когда игроки машут руками.
Клиент рендерит изменение хп, значит, он знает когда игрок получает урон.
В принципе, этого достаточно: если кто-то в радиусе досягаемости смотрит на хитбокс вашего перса, машет рукой и ваш перс получает урон, то этот кто-то вас ударил.
Еще можно подтверждать через ожидание отбрасывания: после удара ваш перс движется от ударившего вас перса.
 

TheAndrey

Редактор учебника
1,071
72
372
Еще можно подтверждать через ожидание отбрасывания: после удара ваш перс движется от ударившего вас перса.
Пожалуй самое достоверное из всего доступного. У читера с KillAura голова может смотреть в совсем другую сторону.
 
Еще можно подтверждать через ожидание отбрасывания: после удара ваш перс движется от ударившего вас перса.
А вот это очень даже хорошая идея. Правда, тогда надо проверять не изменение позиции, а изменение скорости, потому что в момент отбрасывания игрок может двигаться в другом направлении.

А как можно получить эти данные? Или это обычный Motion из тегов игрока?
 
Сверху