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

Помогите Как разрешить игроку двигаться сидя на мобе без седла?

TheKrealisYT

Активный участник
Пользователь
Баллы
66
Имя в Minecraft
_TheKrealisYT_
upload_2022-12-1_7-13-36.png

В одном плагине я нашел этот код и он рабочий. Когда игрок кликает по мобу, то сразу садится, но двигаться не может! Как мне можно разрешить игроку перемещаться сидя на мобе, но без седла?
 
Как вариант можно отлавливать пакеты PacketPlayInSteerVehicle или PacketPlayInVehicleMove.

Я для передвижения стоек для брони использую этот код (для 1.12.2):
Код:
    public void registerHandler(Player player) {
        ChannelDuplexHandler channelDuplexHandler = new ChannelDuplexHandler() {
            @Override
            public void channelRead(ChannelHandlerContext context, Object packet) throws Exception {
                if (packet instanceof PacketPlayInSteerVehicle) {
                    if(player.getVehicle().getType() == EntityType.ARMOR_STAND) { //Тут проверки на то нужно ли управлять существом
                        PacketPlayInSteerVehicle info = (PacketPlayInSteerVehicle) packet;
                        boolean shift = info.d();
                        boolean space = info.c();
                        float forward = info.b();
                        float side = info.a();
                        Location playerloc = player.getLocation();
                        float pitch = playerloc.getPitch();
                        float yaw = playerloc.getYaw();
                        //Тут подсчёт движений и применение к сущности
                        return; //удалить пакет
                    }
                }
                super.channelRead(context, packet);
            }
        };
        ChannelPipeline pipeline = ((CraftPlayer) player).getHandle().playerConnection.networkManager.channel.pipeline();
        pipeline.addBefore("packet_handler", "armorstandsmover", channelDuplexHandler);
    }
    public void unregisterHandler(Player player) {
        Channel channel = ((CraftPlayer) player).getHandle().playerConnection.networkManager.channel;
        channel.eventLoop().submit(() -> {
            channel.pipeline().remove("armorstandsmover");
            return null;
        });
    }
  
    @EventHandler
    public void onEnable() {
        Bukkit.getPluginManager().registerEvents(this, this);
        Bukkit.getOnlinePlayers().forEach(player -> {
            registerHandler(player);
        });
    }
    @EventHandler
    public void onJoin(PlayerJoinEvent event) {
        Player player = event.getPlayer();
        registerHandler(player);
    }
    @EventHandler
    public void onDisable () {
        Bukkit.getOnlinePlayers().forEach(player -> {
            unregisterHandler(player);
        });
    }
    @EventHandler
    public void onQuit(PlayerQuitEvent event) {
        Player player = event.getPlayer();
        unregisterHandler(player);
    }
 

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

Назад
Верх