Вопрос Эффект свечения который виден определённым игрокам

pukpukpuk

Пользователь
Сообщения
4
Стоит задача через пакеты подсвечивать игрока так, чтобы это видел определённый игрок. Прошерстив достаточно тем на других форумах, я нашёл этот код:
Java:
public static void setGlowing(Player send, Player glowing, boolean glow) {
        PacketContainer packet = ProtocolLibrary.getProtocolManager().createPacket(PacketType.Play.Server.ENTITY_METADATA);
        packet.getIntegers().write(0, glowing.getEntityId()); 
        WrappedDataWatcher watcher = new WrappedDataWatcher();
        WrappedDataWatcher.Serializer serializer = WrappedDataWatcher.Registry.get(Byte.class); 

        watcher.setEntity(glowing); 
        watcher.setObject(0, serializer, (byte) (glow ? 0x40 : 0x0) ); // 8

        packet.getWatchableCollectionModifier().write(0, watcher.getWatchableObjects()); 

        try {
            ProtocolLibrary.getProtocolManager().sendServerPacket(send, packet);
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }     
}

Само свечение в этом методе работает отлично. Но помимо свечения, этот метод затрагивает эффект невидимости. (если у игрока которого мы подсвечиваем будет невидимость, то после отправки пакета она визуально пропадёт (тоесть технически на игроке эффект останется, но игрок, который получил пакет, будет видеть игрока, будто он без этого эффекта)).

Как я понял, проблема в значении 0x40 на строке 8. если верить этой это число отвечает за несколько визуальных состояний игрока, что еще больше усугубляет ситуацию.

Вопрос: как изменять только состояние свечения в этом методе и есть ли иные реализации нужного мне эффекта?
 
Решение
Стоит задача через пакеты подсвечивать игрока так, чтобы это видел определённый игрок. Прошерстив достаточно тем на других форумах, я нашёл этот код:
Java:
public static void setGlowing(Player send, Player glowing, boolean glow) {
        PacketContainer packet = ProtocolLibrary.getProtocolManager().createPacket(PacketType.Play.Server.ENTITY_METADATA);
        packet.getIntegers().write(0, glowing.getEntityId());
        WrappedDataWatcher watcher = new WrappedDataWatcher();
        WrappedDataWatcher.Serializer serializer = WrappedDataWatcher.Registry.get(Byte.class);

        watcher.setEntity(glowing);
        watcher.setObject(0, serializer, (byte) (glow ? 0x40 : 0x0) ); // 8...
Стоит задача через пакеты подсвечивать игрока так, чтобы это видел определённый игрок. Прошерстив достаточно тем на других форумах, я нашёл этот код:
Java:
public static void setGlowing(Player send, Player glowing, boolean glow) {
        PacketContainer packet = ProtocolLibrary.getProtocolManager().createPacket(PacketType.Play.Server.ENTITY_METADATA);
        packet.getIntegers().write(0, glowing.getEntityId());
        WrappedDataWatcher watcher = new WrappedDataWatcher();
        WrappedDataWatcher.Serializer serializer = WrappedDataWatcher.Registry.get(Byte.class);

        watcher.setEntity(glowing);
        watcher.setObject(0, serializer, (byte) (glow ? 0x40 : 0x0) ); // 8

        packet.getWatchableCollectionModifier().write(0, watcher.getWatchableObjects());

        try {
            ProtocolLibrary.getProtocolManager().sendServerPacket(send, packet);
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }   
}

Само свечение в этом методе работает отлично. Но помимо свечения, этот метод затрагивает эффект невидимости. (если у игрока которого мы подсвечиваем будет невидимость, то после отправки пакета она визуально пропадёт (тоесть технически на игроке эффект останется, но игрок, который получил пакет, будет видеть игрока, будто он без этого эффекта)).

Как я понял, проблема в значении 0x40 на строке 8. если верить этой это число отвечает за несколько визуальных состояний игрока, что еще больше усугубляет ситуацию.

Вопрос: как изменять только состояние свечения в этом методе и есть ли иные реализации нужного мне эффекта?
Твой код не учитывает значения, которое уже установлено у существа.
Java:
byte mask = dataWatcher.getByte(0);

mask |= 0x40;

dataWatcher.setObject(0, byteSerializer, mask);
 
Твой код не учитывает значения, которое уже установлено у существа.
Да, я знаю, но вопрос выглядел иначе
Объединено

Помимо этого:
Java:
byte mask = dataWatcher.getByte(0);

mask |= 0x40;

dataWatcher.setObject(0, byteSerializer, mask);
Понадобилось изменить строку с получением WrappedDataWatcher (нашел правильный вариант в твоём репозитории)

Конечный код выглядит так:

Java:
    public static void setGlowing(Player send, Player glowing, boolean glow) {
        PacketContainer packet = ProtocolLibrary.getProtocolManager().createPacket(PacketType.Play.Server.ENTITY_METADATA);
        packet.getIntegers().write(0, glowing.getEntityId());
       
        WrappedDataWatcher watcher = WrappedDataWatcher.getEntityWatcher(glowing).deepClone();
        WrappedDataWatcher.Serializer serializer = WrappedDataWatcher.Registry.get(Byte.class);
   
        byte mask = watcher.getByte(0);
        mask |= (glow ? 0x40 : 0x0);
        watcher.setObject(0, serializer, mask);
       
        packet.getWatchableCollectionModifier().write(0, watcher.getWatchableObjects());
        try {
            ProtocolLibrary.getProtocolManager().sendServerPacket(send, packet);
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
       
    }

Спасибо за помощь
 
Последнее редактирование:
Назад
Сверху Снизу