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

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

Статус
Закрыто для дальнейших ответов.

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());

    }

}
 
Последнее редактирование:
Решено. Для тех кто столкнулся или столкнется с подобными задачами, оставлю моё решение здесь.
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 работали.
Закрыто.
 
Статус
Закрыто для дальнейших ответов.

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

Назад
Верх