2016-11-17 2 views
1

Так что я просто научился использовать расписания, и я хотел сделать повторяющуюся задачу, но когда я закончил, я заметил, что команда работает только после каждой перезагрузки. Как я могу это исправить?Команда работает только один раз при каждой перезагрузке

Код:

public class SpawnCommand implements CommandExecutor { 

public int i = 5; 

@SuppressWarnings("deprecation") 
@Override 
public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) { 
    Player p = (Player) sender; 
    if (cmd.getName().equalsIgnoreCase("spawn")) { 
     Bukkit.getScheduler().scheduleAsyncRepeatingTask(JavaPlugin.getProvidingPlugin(Teams.class), new Runnable(){ 
        public void run() { 
         if (i != -1) { 
          if (i != 0) { 
           p.sendMessage("§8§l┃ §3Revenant §8┃ §eTeleporting in §c(" + i + "§c)"); 
           p.playSound(p.getLocation(), Sound.ORB_PICKUP, 1, 0 + i); 
           i--; 
          } else { 
           p.sendMessage("§8§l┃ §3Revenant §8┃ §eTeleporting..."); 
           Location centerblock = new Location(p.getWorld(), 
             p.getWorld().getSpawnLocation().getX() + 0.5, 
             p.getWorld().getSpawnLocation().getY(), 
             p.getWorld().getSpawnLocation().getZ() + 0.5); 
           p.teleport(centerblock); 
           p.playSound(p.getLocation(), Sound.CAT_MEOW, 1, 0); 
           p.playEffect(p.getPlayer().getLocation(centerblock), Effect.ENDER_SIGNAL, 1); 
           p.playEffect(p.getPlayer().getLocation(centerblock), Effect.MOBSPAWNER_FLAMES, 1); 
           i--; 
          } 
         } 
        } 
       }, 0L, 20L); 
    } 
    return true; 
} 
} 
+0

Обратитесь к [нашей документации] (http://stackoverflow.com/documentation/bukkit/5436/scheduler-programming#t=201611171536580915453), чтобы лучше всего понять планирование задач Bukkit. Ваша задача не должна быть асинхронной, так как она использует API Bukkit. – Kerooker

ответ

2

i в вашей задачей является общим для всех задач, поскольку он объявлен в классе команд.

Кроме того, Ваша задача должна быть синхронизирована. Использование асинхронного API Bukkit недействительно, и будет вызывать проблемы (хотя не проблемы, которые вы испытывали).

Вот фиксированная версия, используя BukkitRunnable вместо Runnable, а так, что задача не может быть отменен, если он больше не нужен (прямо сейчас, даже если i -1, задача по-прежнему работает каждый тик, а это означает, что если команда использовалась сто раз, у вас было бы сто заданий, каждый тик ... не идеально). BukkitRunnable упрощает запуск и отмену задач.

import org.bukkit.scheduler.BukkitRunnable; 
// ... other imports ... 

public class SpawnCommand implements CommandExecutor { 
    @SuppressWarnings("deprecation") 
    @Override 
    public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) { 
     if (!(sender instanceof Player)) { 
      sender.sendMessage("§cYou must be a player to run use command."); 
      return true; 
     } 
     Player p = (Player) sender; 
     if (cmd.getName().equalsIgnoreCase("spawn")) { 
      BukkitRunnable task = new BukkitRunnable() { 
        /** 
        * Counter until teleport time 
        */ 
        int i = 5; 

        @Override 
        public void run() { 
         if (i != 0) { 
          p.sendMessage("§8§l┃ §3Revenant §8┃ §eTeleporting in §c(" + i + "§c)"); 
          p.playSound(p.getLocation(), Sound.ORB_PICKUP, 1, 0 + i); 
          i--; 
         } else { 
          p.sendMessage("§8§l┃ §3Revenant §8┃ §eTeleporting..."); 
          Location centerblock = new Location(p.getWorld(), 
            p.getWorld().getSpawnLocation().getX() + 0.5, 
            p.getWorld().getSpawnLocation().getY(), 
            p.getWorld().getSpawnLocation().getZ() + 0.5); 
          p.teleport(centerblock); 
          p.playSound(p.getLocation(), Sound.CAT_MEOW, 1, 0); 
          p.playEffect(p.getPlayer().getLocation(centerblock), Effect.ENDER_SIGNAL, 1); 
          p.playEffect(p.getPlayer().getLocation(centerblock), Effect.MOBSPAWNER_FLAMES, 1); 

          // This task is done; we can terminate it now 
          this.cancel(); 
         } 
        } 
      }); 
      task.runTaskTimer(JavaPlugin.getProvidingPlugin(Teams.class), 0L, 20L); 
     } 
     return true; 
    } 
} 

new BukkitRunnable() {} Поскольку фактически создает новый класс, который расширяет BukkitRunnable инлайн, вы можете добавить переменные-члены там.