Java 命令仅在每次重新加载时工作一次

Java 命令仅在每次重新加载时工作一次,java,minecraft,bukkit,Java,Minecraft,Bukkit,所以我刚刚学会了使用时间表,我想做一个重复的任务,但当我完成后,我注意到命令只在每次重新加载时起作用一次。我怎样才能解决这个问题 代码: 任务中的i在所有任务之间共享,因为它是在命令类中声明的 另外,您的任务需要同步。异步使用Bukkit API是无效的,会导致问题(尽管不是您遇到的问题) 这里有一个固定版本,使用BukkitRunnable而不是Runnable,这样在不再需要时可以取消任务(现在,即使i为-1,任务仍会运行每个勾号,这意味着如果命令使用一百次,每个勾号将有一百个任务……这并不

所以我刚刚学会了使用时间表,我想做一个重复的任务,但当我完成后,我注意到命令只在每次重新加载时起作用一次。我怎样才能解决这个问题

代码:


任务中的
i
在所有任务之间共享,因为它是在命令类中声明的

另外,您的任务需要同步。异步使用Bukkit API是无效的,会导致问题(尽管不是您遇到的问题)

这里有一个固定版本,使用
BukkitRunnable
而不是
Runnable
,这样在不再需要时可以取消任务(现在,即使
i
为-1,任务仍会运行每个勾号,这意味着如果命令使用一百次,每个勾号将有一百个任务……这并不理想)
bukkitrunable
可以方便地启动和取消任务

import org.bukkit.scheduler.bukkitrunable;
// ... 其他进口。。。
公共类spawn命令实现CommandExecutor{
@抑制警告(“弃用”)
@凌驾
公共布尔onCommand(CommandSender-sender、Command cmd、String commandLabel、String[]args){
如果(!(播放机的发送方实例)){
sender.sendMessage(§cYou必须是运行use命令的玩家。”);
返回true;
}
玩家p=(玩家)发送者;
if(cmd.getName().equalsIgnoreCase(“spawn”)){
BukkitRunnable task=新的BukkitRunnable(){
/**
*直到传送时间
*/
int i=5;
@凌驾
公开募捐{
如果(i!=0){
p、 发送消息(§8§l┃ §3收入§8┃  §c(“i+”§c)”中的ETeleport;
p、 播放声音(p.getLocation(),Sound.ORB_拾取,1,0+i);
我--;
}否则{
p、 发送消息(§8§l┃ §3收入§8┃  §电子竞技……);
位置中心块=新位置(p.getWorld(),
p、 getWorld().getSpawnLocation().getX()+0.5,
p、 getWorld().getSpawnLocation().getY(),
p、 getWorld().getSpawnLocation().getZ()+0.5);
p、 传送(中心块);
p、 播放声音(p.getLocation(),Sound.CAT_-MEOW,1,0);
p、 播放效果(p.getPlayer().getLocation(中心块),Effect.ENDER_信号,1);
p、 playEffect(p.getPlayer().getLocation(中心块),Effect.mobprowner_FLAMES,1);
//这项任务已经完成,我们现在可以终止它
这个。取消();
}
}
});
task.runTaskTimer(JavaPlugin.getProvisingPlugin(Teams.class)),0L,20L;
}
返回true;
}
}
由于
new BukkitRunnable(){}
实际上正在创建一个扩展
BukkitRunnable
内联的新类,因此可以在其中添加成员变量。

请参阅以更好地理解Bukkit任务调度。您的任务不应该是异步的,因为它使用bukkitapi。
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;
}
 }