Запрет удара по сущности на клиенте

Статус
В этой теме нельзя размещать новые ответы.
Версия Minecraft
1.8.9
22
1
0
Здравствуйте, я работаю над одним очень простым модом, мод на друзей, его основная суть заключается в том, что даже если ты бьёшь по другу(нажимаешь левой кнопкой мыши наведённой на него) при игре на сервере, удар именно по нему просто не проходит. В гугле ничего толкового я найти не смог и начинаю подозревать что надо шаманить с пакетами. С конфигом.

Если что простите за тупость, я впервые переехал с плагинов на моды.
 
Решение
Попробуй перехватить PlayerControllerMP#attackEntity. Второй аргумент метода - это сущность, по которой ударил игрок. Т.е. тебе нужно отменять вызов оригинального метода, если сущность является другом игрока.
Код хука будет примерно такой
Java:
    @Hook(returnCondition = ReturnCondition.ON_TRUE)
    public static boolean attackEntity(PlayerControllerMP controller, EntityPlayer player, Entity entity) {
        return isFriend((EntityPlayer)entity); // заменяешь на свою проверку
    }
22
1
0
код покажи, мы не ясновидящие
Вот код,это то что есть на данный момент, остальной код я решил убрать до решения проблемы с отменой.
Код:
@SubscribeEvent
public void onHit(LivingAttackEvent event) {
    event.setResult(Result.DENY);
    event.setCancelled(true);
}
 
22
1
0
Так же делай надо будет делать проверку что игрок которого ты ударил является твоим другом и отменять эвент
Дело в том, что я уже написал нужный код для проверки друг ли или нет, я просто убрал его временно, чтобы сконцентрироваться на данной проблеме. Но код отмены уже не работает.
 
477
7
51
Java:
    @SubscribeEvent
    public void onLivingAttack(LivingHurtEvent e){
        if(!(e.entityLiving instanceof EntityPlayerMP)){
            return;
        }

        FriendsPlayer player = FriendsPlayer.forPlayer((EntityPlayerMP)e.entityLiving);
        Entity target = e.source.getSourceOfDamage();
        
        if(target instanceof EntityPlayerMP){
            if(player.isInFriends((EntityPlayerMP)target)){
                    e.ammount = e.ammount / 2F;
            }
        }
    }
Пример
 
477
7
51
Дамаг игроку которого ударили уменьшается в 2 раза
Да
Как я понял это подойдёт только для одиночной игры
нет
ведь не может же клиент изменить дамаг на сервере?
Этот эвент используется на серверной стороне
 
477
7
51
Изначально я писал мод именно для клиента
Лол, логику видишь нет? Вот именно её нет ты пытаешься на клиенте отменить урон по друзьям, бив игрока на сервере..
 
22
1
0
Лол, логику видишь нет? Вот именно её нет ты пытаешься на клиенте отменить урон по друзьям, бив игрока на сервере..
Не отменить урон, а отменить отправку пакетов о ударе на сервер со стороны клиента. То есть вообще не сообщать серверу об ударе.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху