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;
}
}