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

Помогите Отключить коллизию игроков в определенном мире

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

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

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

    Баллы:
    76
    Нужно в определенном мире сделать так, чтобы игроки не могли толкаться (отключить для них коллизию). Так как Player#setCollidable(bool) не работает, я попробовал вариант с добавлением опции COLLISION_RULE = NEVER к группе игрока, но это по-прежнему не работает. Код прилагаю. Подскажите, пожалуйста, что я делаю не так или, возможно, есть способ проще, без таких костылей.

    PHP:
    @EventHandler(priority EventPriority.HIGHEST)
        public 
    void onPlayerJoin(PlayerJoinEvent event) {
            
    Player player event.getPlayer();
            
    manageCollidable(player);

        }

        private 
    void manageCollidable(Player player) {
            
    Team noCollisionTeam player.getScoreboard().getTeam("noCollision");
            if (
    noCollisionTeam == null) {
                
    noCollisionTeam player.getScoreboard().registerNewTeam("noCollision");
            }
            if (
    noCollisionTeam.getOption(Team.Option.COLLISION_RULE) != Team.OptionStatus.NEVER)
                
    noCollisionTeam.setOption(Team.Option.COLLISION_RULETeam.OptionStatus.NEVER);

            if (
    service.getRestrictedWorlds().contains(player.getWorld()))
                
    noCollisionTeam.addEntry(player.getName());
            else
                
    noCollisionTeam.removeEntry(player.getName());
        }
     
  2. imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Судя по документации к Team.Option, следует наоборот ставить ALWAYS.
    upload_2024-4-22_19-26-28.png
    Просто предупрежу, что сам таким не занимался, наверняка сказать не могу.
     
  3. Автор темы
    reZero

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

    Баллы:
    76
    Не совсем.
    Как раз исходя из документации следует устанавливать правилу COLLISION_RULE значение NEVER, чтобы не применять коллизию к энтитям в этой группе.
    Даже проверив эту опцию "на шару" ничего не получилось. Я до сих пор не понимаю, как отменять коллизию игроков...
     
  4. OJIEKCAHDP

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

    Баллы:
    76
    Имя в Minecraft:
    OJIEKCAHDP
    Могу ошибаться, но, возможно следует игроку присваивать скорборд после внесённых изменений? А может какой-то другой плагин присваивает свой скорборд?
     
  5. Автор темы
    reZero

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

    Баллы:
    76
    Изначально я не создаю своего скорбода. Я беру скорборд игрока и добавляю в него новую тиму с нужным правилом, а затем добавляю в эту тиму игрока. По идее, этот же скорборд у игрока и остался
     
  6. OJIEKCAHDP

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

    Баллы:
    76
    Имя в Minecraft:
    OJIEKCAHDP
    По идее то да, а на деле может другое :ninja:
     
  7. Автор темы
    reZero

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

    Баллы:
    76
    PHP:
    @EventHandler(priority EventPriority.HIGHEST)
        public 
    void onPlayerJoin(PlayerJoinEvent event) {
            
    Player player event.getPlayer();
            
    manageCollidable(player);

        }

        private 
    void manageCollidable(Player player) {
            
    Scoreboard scoreboard Bukkit.getScoreboardManager().getNewScoreboard();
            
    Team team scoreboard.registerNewTeam("noCollisionTeam");
            
    team.setOption(Team.Option.COLLISION_RULETeam.OptionStatus.NEVER);
            
    team.addPlayer(player);
            
    player.setScoreboard(scoreboard);
    }
    Так тоже не работает
     
  8. mirrerror

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

    Баллы:
    76
    Имя в Minecraft:
    mirrerror
  9. Автор темы
    reZero

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

    Баллы:
    76
  10. mirrerror

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

    Баллы:
    76
    Имя в Minecraft:
    mirrerror
    попробуй это делать в основном scoreboard
     
  11. Автор темы
    reZero

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

    Баллы:
    76
    Это тоже не помогает
     
  12. mirrerror

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

    Баллы:
    76
    Имя в Minecraft:
    mirrerror
    У тебя игроки могут быть в разных scoreboard, так как ты каждый раз создаешь новый. Также, возможно, у тебя регистрация новой тимы выбрасывает эксепшн, так как ты ее все время регистрируешь, не проверяя ее существование. Ну, и, на всякий, проверь, что ты зарегистрировал слушатель.
    upload_2024-4-24_16-38-25.png
     

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