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

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

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

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

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

    Баллы:
    66
    Имя в Minecraft:
    _TheKrealisYT_
    upload_2022-12-1_7-13-36.png

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

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

    Баллы:
    76
    Как вариант можно отлавливать пакеты 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);
        }
    
     

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