Помогите Как передать переменную в поток?

Bezobrazie

Активный участник
Пользователь
Баллы
46
Имя в Minecraft
MySoulIsCry
У меня есть класс с методом который вызывает поток с таймером который работает на арморстендах. проблема: я хочу чтобы колво секунд в таймере я мог указывать при вызове метода в другом классе я сделал чтобы мой метод принимал интовое число (sec) но как мне передать переменную из одного метода в другой(run. поток который считает). сам поток вызывается с помощью id = Bukkit.getScheduler().scheduleSyncRepeatingTask(plugin, (Runnable) this, 0, 20); фигзнает как передать через него переменную
мой класс:
Код:
public class TimerB implements Runnable {

    private int t = 10;
    private int id;
  
    private final ru.OBC.Main.Main plugin;

    public TimerB(ru.OBC.Main.Main plugin2) {
        this.plugin = plugin2;
    }
    public void random(Location loc, int prog, Player p, int sec) {
        int x = loc.getBlockX();
        int y = loc.getBlockY();
        int z = loc.getBlockZ();
        p.spawnParticle(Particle.CLOUD, new Location(p.getWorld(), (x+0.5) + Math.random(), (y+0.5)+ Math.random(), (z+0.5)+ Math.random()), (int) 0.99999);
        p.spawnParticle(Particle.CLOUD, new Location(p.getWorld(), (x+0.5) - Math.random(), (y+0.5)- Math.random(), (z+0.5)- Math.random()), (int) 0.99999);
        p.spawnParticle(Particle.CLOUD, new Location(p.getWorld(), (x+0.5) - Math.random(), (y+0.5)- Math.random(), (z+0.5)+ Math.random()), (int) 0.99999);
        p.spawnParticle(Particle.CLOUD, new Location(p.getWorld(), (x+0.5) + Math.random(), (y+0.5)- Math.random(), (z+0.5)- Math.random()), (int) 0.99999);
       id = Bukkit.getScheduler().scheduleSyncRepeatingTask(plugin, (Runnable) this, 0, 20);      
        }
    @Override
    public void run() {
      
        World w = Bukkit.getWorld("world");
        Location loc = new Location(w, 0.5, 61, 0.5);
        loc.getBlock().setType(Material.BEDROCK);
        ArmorStand a = (ArmorStand) loc.getWorld().spawnEntity(loc, EntityType.ARMOR_STAND);
        a.setVisible(false);
        String str = Integer.toString(t);
        a.setCustomName(ChatColor.GREEN+str);
        a.setCustomNameVisible(true);
        a.setGravity(false);
        if(t == 0) {
            Bukkit.getScheduler().cancelTask(id);
            loc.getBlock().setType(Material.GRASS_BLOCK);
        }
        a.remove();
        t--;
    }
    }
 
Последнее редактирование:
Юзай лямбда функцию внутри создания шедулера, тобишь
Код:
id = Bukkit.getScheduler().scheduleSyncRepeatingTask(plugin, () -> {
//тело функции run
}, 0, 20);
 
Юзай лямбда функцию внутри создания шедулера, тобишь
Код:
id = Bukkit.getScheduler().scheduleSyncRepeatingTask(plugin, () -> {
//тело функции run
}, 0, 20);
да вродь работает спасибо! но почему я не могу Юзать это upload_2021-5-8_0-18-41.png
 
Последнее редактирование:
Я надеюсь ты понимаешь, что если ты будешь юзать этот метод на каждого игрока, твоя переменная t глобальная для всех, тобишь у первого игрока t = 10, а у второго, которого ты передал в метод, t уже будет равно стольки, сколько прошло.

Твоя реализация неверная, в твоем случае должно выглядить как-то так:
Код:
public class TimerB {

    private int t = 10;
    private int sec;
    private Player player;
    private Location loc;

    public TimerB(Player player, int sec, Location loc) {
        this.sec = sec;
        this.player = player;
        this.loc = loc;
        start();
    }

    public void start(){
        int x = loc.getBlockX();
        int y = loc.getBlockY();
        int z = loc.getBlockZ();
        player.spawnParticle(Particle.CLOUD, new Location(player.getWorld(), (x+0.5) + Math.random(), (y+0.5)+ Math.random(), (z+0.5)+ Math.random()), (int) 0.99999);
        player.spawnParticle(Particle.CLOUD, new Location(player.getWorld(), (x+0.5) - Math.random(), (y+0.5)- Math.random(), (z+0.5)- Math.random()), (int) 0.99999);
        player.spawnParticle(Particle.CLOUD, new Location(player.getWorld(), (x+0.5) - Math.random(), (y+0.5)- Math.random(), (z+0.5)+ Math.random()), (int) 0.99999);
        player.spawnParticle(Particle.CLOUD, new Location(player.getWorld(), (x+0.5) + Math.random(), (y+0.5)- Math.random(), (z+0.5)- Math.random()), (int) 0.99999);
        run();
    }

    public void run() {
        new Thread(() -> {
            while (true){
                if(t == 0) {
                    loc.getBlock().setType(Material.GRASS_BLOCK);
                    return;
                }
                World w = Bukkit.getWorld("world");
                Location loc = new Location(w, 0.5, 61, 0.5);
                loc.getBlock().setType(Material.BEDROCK);
                ArmorStand a = (ArmorStand) loc.getWorld().spawnEntity(loc, EntityType.ARMOR_STAND);
                a.setVisible(false);
                String str = Integer.toString(t);
                a.setCustomName(ChatColor.GREEN+str);
                a.setCustomNameVisible(true);
                a.setGravity(false);
                a.remove();
                t--;
                try {
                    Thread.sleep(1000);
                }
                catch (Exception ignored) {}
            }
        }).start();
    }
}
 
Я надеюсь ты понимаешь, что если ты будешь юзать этот метод на каждого игрока, твоя переменная t глобальная для всех, тобишь у первого игрока t = 10, а у второго, которого ты передал в метод, t уже будет равно стольки, сколько прошло.

Твоя реализация неверная, в твоем случае должно выглядить как-то так:
Код:
public class TimerB {

    private int t = 10;
    private int sec;
    private Player player;
    private Location loc;

    public TimerB(Player player, int sec, Location loc) {
        this.sec = sec;
        this.player = player;
        this.loc = loc;
        start();
    }

    public void start(){
        int x = loc.getBlockX();
        int y = loc.getBlockY();
        int z = loc.getBlockZ();
        player.spawnParticle(Particle.CLOUD, new Location(player.getWorld(), (x+0.5) + Math.random(), (y+0.5)+ Math.random(), (z+0.5)+ Math.random()), (int) 0.99999);
        player.spawnParticle(Particle.CLOUD, new Location(player.getWorld(), (x+0.5) - Math.random(), (y+0.5)- Math.random(), (z+0.5)- Math.random()), (int) 0.99999);
        player.spawnParticle(Particle.CLOUD, new Location(player.getWorld(), (x+0.5) - Math.random(), (y+0.5)- Math.random(), (z+0.5)+ Math.random()), (int) 0.99999);
        player.spawnParticle(Particle.CLOUD, new Location(player.getWorld(), (x+0.5) + Math.random(), (y+0.5)- Math.random(), (z+0.5)- Math.random()), (int) 0.99999);
        run();
    }

    public void run() {
        new Thread(() -> {
            while (true){
                if(t == 0) {
                    loc.getBlock().setType(Material.GRASS_BLOCK);
                    return;
                }
                World w = Bukkit.getWorld("world");
                Location loc = new Location(w, 0.5, 61, 0.5);
                loc.getBlock().setType(Material.BEDROCK);
                ArmorStand a = (ArmorStand) loc.getWorld().spawnEntity(loc, EntityType.ARMOR_STAND);
                a.setVisible(false);
                String str = Integer.toString(t);
                a.setCustomName(ChatColor.GREEN+str);
                a.setCustomNameVisible(true);
                a.setGravity(false);
                a.remove();
                t--;
                try {
                    Thread.sleep(1000);
                }
                catch (Exception ignored) {}
            }
        }).start();
    }
}
если это не правильно то как сделать правильно чтобы таймеры разные были? я придумал только такой варик.
 
Создаёшь класс с наследием от BukkitRunnable и там распоряжаешься данными.

Код:
public class Timer extends BukkitRunnable {
    private Player player;
    int time = 100;

    public Timer(Player player) {
          this.player = player;
    }

    public void run() {
           if (time <= 0) {
                cancel();
                return;
           }
           // todo
          --time;
    }
}
Код:
Timer timer = new Timer(player);
timer.runTaskTimer(plugin, 0, 20);

// Если правильно понял из того, что описано в посте, то изменять данные извне так:
timer.time = 999;
 
Последнее редактирование:
Назад
Верх