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

Помогите Плагин работает без ошибок, но и не телепортирует

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

Статус темы:
Закрыта.
  1. Автор темы
    Aviloo

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

    Баллы:
    61
    Имя в Minecraft:
    Aviloo
    Всем привет. Писал плагин на рандомную телепортацию и столкнулся с проблемой. При отправке команды ничего не происходит, ни ошибок в консоль , ни непосредственно телепортации. Только выводит в консоль строку предназначенную, если не игрок попытается ввести команду. Попытался понять в чем суть, но никак не могу сообразить. Хотя я скорее всего перемудрил с Scheduler` ом. Ниже прилагаю код. Буду благодарен ,если кто-нибудь покажет, где я накосячил. Заранее, спасибо.
    Скрин консоли : upload_2024-8-20_9-6-5.png
    Код Команды:
    Код:
    package me.aviloo.myrtp.Commands;
    
    import me.aviloo.myrtp.Utils.ColorUtils;
    import me.aviloo.myrtp.Utils.TeleportUtils;
    import org.bukkit.Bukkit;
    import org.bukkit.command.Command;
    import org.bukkit.command.CommandExecutor;
    import org.bukkit.command.CommandSender;
    import org.bukkit.entity.Player;
    public class defaultTeleportSubCommand implements CommandExecutor {
        @Override
        public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        
    if(!(sender instanceof Player)) {
        sender.sendMessage(ColorUtils.translateColorCodes(
                "&7[&6MyRTP&7] &fThis command can only be used by players!"));
        return true;
    }
    
            Player player = (Player) sender;
            if(command.getName().equalsIgnoreCase("rtp")) {
                Bukkit.broadcastMessage("c1");
                TeleportUtils.defaultTeleport(player, -500, 500,
                        -500, 500, (player.getWorld()));
                Bukkit.broadcastMessage("c2");
            }
    
            return true;
        }
    }

    Код Телепорта (На всякий случай):
    Код:
    package me.aviloo.myrtp.Utils;
    
    import me.aviloo.myrtp.MyRTP;
    import org.bukkit.Bukkit;
    import org.bukkit.Location;
    import org.bukkit.World;
    import org.bukkit.entity.Player;
    import org.bukkit.scheduler.BukkitRunnable;
    
    public class TeleportUtils {
    
        private static int randomBetween(int min, int max) {
            max -= min;
            return (int) (Math.random() * ++max) + min;
        }
    
        private static Location defaultLocation;
    
        private static void getTeleportLocation(Player player, int minX,
                        int maxX, int minZ, int maxZ, World world) {
    
            int x = randomBetween(minX, maxX);
            int z = randomBetween(minZ, maxZ);
            int y = world.getHighestBlockAt(x, z).getY() + 1;
            Location loc = new Location(world, x, y, z);
    
            defaultLocation = loc;
        }
    
    
        public static void defaultTeleport(Player player, int minX,
                                           int maxX, int minZ, int maxZ, World world) {
    
            new BukkitRunnable() {
                @Override
                public void run() {
                    boolean isSafeToTeleport = false;
                    while (!isSafeToTeleport){
                        getTeleportLocation(player, minX, maxX, minZ, maxZ, world);
                        if(!defaultLocation.add(0,-1,0).getBlock().isLiquid()){
                            isSafeToTeleport = true;
                            break;
                        }
    
                        Bukkit.getScheduler().runTask(MyRTP.getPlugin(),() -> {
                            player.teleport(defaultLocation);
                            player.sendMessage(ColorUtils.translateColorCodes(
                                    "&7[&6Система&7] &fВы были перемещены на координаты " +
                                            defaultLocation.getX()+", "+defaultLocation.getY()+
                                            ", "+defaultLocation.getZ()
                            ));
                        });
    
                        cancel();
    
                    }
                }
    
            }.runTaskAsynchronously(MyRTP.getPlugin());
    
        }
    
    }
    
     
    Последнее редактирование: 20 авг 2024
  2. Автор темы
    Aviloo

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

    Баллы:
    61
    Имя в Minecraft:
    Aviloo
    Решено. Для тех кто столкнулся или столкнется с подобными задачами, оставлю моё решение здесь.
    P.S: Не исключаю, что есть более изящное решение, но как знаю, как умею, так и решаю.
    Код:
    package me.aviloo.myrtp.Utils;
    
    import io.papermc.lib.PaperLib;
    import me.aviloo.myrtp.MyRTP;
    import org.bukkit.Location;
    import org.bukkit.Material;
    import org.bukkit.World;
    import org.bukkit.entity.Player;
    import org.bukkit.scheduler.BukkitRunnable;
    
    public class TeleportUtils {
    
        public static int taskId;
    
        public TeleportUtils(Player player, int minX,
                             int maxX, int minZ, int maxZ, World world){
            defaultTeleport(player, minX, maxX, minZ, maxZ, world);
        }
    
        private int randomBetween(int min, int max) {
            max -= min;
            return (int) (Math.random() * ++max) + min;
        }
    
        private Location getTeleportLocation(int minX,
                                                int maxX, int minZ, int maxZ, World world) {
    
            int x = randomBetween(minX, maxX);
            int z = randomBetween(minZ, maxZ);
            int y = world.getHighestBlockAt(x, z).getY() + 1;
            Location loc = new Location(world, x, y, z);
    
            return loc;
        }
    
    
        private void defaultTeleport(Player player, int minX,
                                           int maxX, int minZ, int maxZ, World world) {
    
            taskId = new BukkitRunnable() {
                @Override
                public void run() {
                    boolean isSafeToTeleport = false;
                    while (!isSafeToTeleport) {
                        Location loc = getTeleportLocation(minX, maxX, minZ, maxZ, world);
                        if (isSafeCondition(loc.clone())) {
                            PaperLib.getChunkAtAsync(loc.clone());
                            PaperLib.teleportAsync(player,loc.clone());
                            player.sendMessage(ColorUtils.translateColorCodes(
                                    "&7[&6Система&7] &fВы были перемещены на координаты &6" +
                                            loc.getX()+", "+
                                            loc.getY()+
                                            ", "+
                                            loc.getZ()
                            ));
                            isSafeToTeleport = true;
                            break;
                        }
                    }
    
                        cancel();
    
                    }
    
            }.runTaskAsynchronously(MyRTP.getPlugin()).getTaskId();
    
        }
    
        private boolean isSafeCondition(Location location){
            if(location.getBlock().isLiquid()){return false;}
            if(location.add(0,-1,0).getBlock().isLiquid()){return false;}
            if(location.getBlock().getType().equals(Material.MAGMA_BLOCK)){return false;}
    
            return true;
        }
    
    }
    P.P.S: Если решите использовать это решение не забудьте подключить PaperLib, дабы teleportAsync и getChunkAtAsync работали.
    Закрыто.
     
Статус темы:
Закрыта.

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