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

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

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_RULE, Team.OptionStatus.NEVER);

        if (service.getRestrictedWorlds().contains(player.getWorld()))
            noCollisionTeam.addEntry(player.getName());
        else
            noCollisionTeam.removeEntry(player.getName());
    }
 
Судя по документации к Team.Option, следует наоборот ставить ALWAYS.
upload_2024-4-22_19-26-28.png
Просто предупрежу, что сам таким не занимался, наверняка сказать не могу.
 
Судя по документации к Team.Option, следует наоборот ставить ALWAYS.
Посмотреть вложение 67112
Просто предупрежу, что сам таким не занимался, наверняка сказать не могу.
Не совсем.
Как раз исходя из документации следует устанавливать правилу COLLISION_RULE значение NEVER, чтобы не применять коллизию к энтитям в этой группе.
Даже проверив эту опцию "на шару" ничего не получилось. Я до сих пор не понимаю, как отменять коллизию игроков...
 
Могу ошибаться, но, возможно следует игроку присваивать скорборд после внесённых изменений? А может какой-то другой плагин присваивает свой скорборд?
 
Могу ошибаться, но, возможно следует игроку присваивать скорборд после внесённых изменений? А может какой-то другой плагин присваивает свой скорборд?
Изначально я не создаю своего скорбода. Я беру скорборд игрока и добавляю в него новую тиму с нужным правилом, а затем добавляю в эту тиму игрока. По идее, этот же скорборд у игрока и остался
 
Изначально я не создаю своего скорбода. Я беру скорборд игрока и добавляю в него новую тиму с нужным правилом, а затем добавляю в эту тиму игрока. По идее, этот же скорборд у игрока и остался
По идее то да, а на деле может другое :ninja:
 
По идее то да, а на деле может другое :ninja:
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_RULE, Team.OptionStatus.NEVER);
        team.addPlayer(player);
        player.setScoreboard(scoreboard);
}
Так тоже не работает
 
попробуй это делать в основном scoreboard
 
Это тоже не помогает
У тебя игроки могут быть в разных scoreboard, так как ты каждый раз создаешь новый. Также, возможно, у тебя регистрация новой тимы выбрасывает эксепшн, так как ты ее все время регистрируешь, не проверяя ее существование. Ну, и, на всякий, проверь, что ты зарегистрировал слушатель.
upload_2024-4-24_16-38-25.png
 

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

Назад
Верх