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

Помогите Изменение здоровья без дерганья экрана

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

  1. Автор темы
    baksovic111

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

    Баллы:
    88
    Мне давно известна проблема когда при установке, setMaxHealth или setHealthScale, экран дергается от получения урона.

    Нашел один способ обхода этой проблемы, использовать новый метод вместо setMaxHealth, GENERIC_MAX_HEALTH.
    Все-бы хорошо, но этот способ изменяет и healthScale
    Мне-же нужно изменить здоровье, не изменяя healthScale, БЕЗ ДЕРГАНЬЯ ЭКРАНА.
    Думал может отправлять, healthScale игроку пакетом, но не знаю какой пакет за это отвечает да и не знаю поможет ли это.

    Что подскажете господа?
    Какие есть способы?
    Готов даже заплатить кто поможет)
     
  2. StrEight

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

    Баллы:
    61
    Имя в Minecraft:
    StrEight
    К слову, после того, как пофиксишь изменение хп без добавления сердец, то можно было бы создать простой плагин, который будет отдельно выполнять эту функцию(на самом деле там ещё понадобится боссбар для удобного отображения). Использовать твой RPGPL лишь из-за изменения хп не очень удобно.
    Прости за оффтоп, в личку я тебе почему-то написать не смог.
     
  3. Автор темы
    baksovic111

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

    Баллы:
    88
    Ну, я бы не сказал что в RPGPL только изменение ХП ;D
    Там не много в 500раз больше функционала
     
  4. alexandrage

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

    Баллы:
    173
    Я делал пакетами, все равно будет дергаться. Выбрасывай.

    Код:
            ProtocolManager manager = ProtocolLibrary.getProtocolManager();
            manager.addPacketListener(new PacketAdapter(this.plugin, PacketType.Play.Server.UPDATE_HEALTH) {
                @Override
                public void onPacketSending(PacketEvent event) {
                    WrapperPlayServerUpdateHealth packet = new WrapperPlayServerUpdateHealth(event.getPacket());
                    float hp = (float) (event.getPlayer().getHealth() * 20
                            / (int) event.getPlayer().getAttribute(Attribute.GENERIC_MAX_HEALTH).getBaseValue());
                    packet.setHealth(hp);
                }
            });
    
            manager.addPacketListener(new PacketAdapter(this.plugin, PacketType.Play.Server.UPDATE_ATTRIBUTES) {
                @Override
                public void onPacketSending(PacketEvent event) {
                    try {
                        WrapperPlayServerUpdateAttributes packet = new WrapperPlayServerUpdateAttributes(event.getPacket());
                        Entity e = packet.getEntity(event);
                        if (e.getType() == EntityType.PLAYER) {
                            List<WrappedAttribute> list = packet.getAttributes();
                            for (int i = 0; i < list.size(); i++) {
                                WrappedAttribute atr = list.get(i);
                                if (atr.getAttributeKey().equals("generic.maxHealth")) {
                                    list.remove(atr);
                                }
                            }
                            packet.setAttributes(list);
                        }
                    } catch (Exception e) {
                    }
                }
            });
    
            manager.addPacketListener(new PacketAdapter(this.plugin, PacketType.Play.Server.ENTITY_METADATA) {
                @Override
                public void onPacketSending(PacketEvent event) {
                    try {
                        WrapperPlayServerEntityMetadata packet = new WrapperPlayServerEntityMetadata(event.getPacket());
                        Entity e = packet.getEntity(event);
                        if (e.getType() == EntityType.PLAYER) {
                            for (WrappedWatchableObject meta : packet.getMetadata()) {
                                if (meta.getIndex() == 7) {
                                    float hp = (float) (event.getPlayer().getHealth() * 20 / (int) event.getPlayer()
                                            .getAttribute(Attribute.GENERIC_MAX_HEALTH).getBaseValue());
                                    meta.setValue(hp);
                                }
                            }
                        }
                    } catch (Exception e) {
                    }
                }
            });
     
  5. Автор темы
    baksovic111

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

    Баллы:
    88
    Выходит решения этой проблемы нету?
     
  6. alexandrage

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

    Баллы:
    173
    +
     

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