Bukkit 自定义死亡系统
Bukkit Custom death system
我正在为我的世界服务器制作一个 bedwars 插件,我实际上在自定义死亡系统中,我有一个有效的代码:
@EventHandler
public void onPlayerDeath(PlayerDeathEvent e) {
e.getEntity().spigot().respawn();
String[] pos = Main.death_coords.split("\*");
World w = e.getEntity().getWorld();
Location loc = new Location(w, Double.parseDouble(pos[0]), Double.parseDouble(pos[1]), Double.parseDouble(pos[2]));
e.getEntity().teleport(loc);
e.getEntity().setGameMode(GameMode.SPECTATOR);
task = Bukkit.getServer().getScheduler().runTaskTimer(Main.plugin, () -> {
int count = 5;
if(count == 0) {
task.cancel();
sendtitle("SusyBaka", e.getEntity());
e.getEntity().setGameMode(GameMode.SURVIVAL);
} else {
count--;
sendtitle(Integer.toString(count), e.getEntity());
}
}, 20, 20);
}
但是当我被杀时,我卡住了,因为 count 每秒都是一个新变量,它卡住了一个 5,我试图让 count 成为一个 public int 变量,但它只适用于 1 次死亡,否则是即时重生。
如何实现?
将 count
变量放在方法之外(即 public)是个好主意。实际上,你是这样做的:
- 计数 = 5。计数 -1 -> 4。
- 计数 = 5。计数 -1 -> 4。
- 计数 = 5。计数 -1 -> 4。
- 等...
您必须将计数器设置为 public,但也 link 给用户。你可以用地图来做。
还有一个更好的解决方案:在这种情况下不要使用 lambda,而是使用它:
@EventHandler
public void onPlayerDeath(PlayerDeathEvent e) {
// here your code
task = Bukkit.getServer().getScheduler().runTaskTimer(Main.plugin, new Runnable() {
// complete runnable instance instead of implicit one
private int count = 5; // counter define only for this runnable instance
@Override
public void run() {
if(count == 0) {
task.cancel();
// finished
} else {
count--; // here it will remove 1 but keep it for next iteration
sendtitle(Integer.toString(count), e.getEntity());
}
}
}, 20, 20);
}
我正在为我的世界服务器制作一个 bedwars 插件,我实际上在自定义死亡系统中,我有一个有效的代码:
@EventHandler
public void onPlayerDeath(PlayerDeathEvent e) {
e.getEntity().spigot().respawn();
String[] pos = Main.death_coords.split("\*");
World w = e.getEntity().getWorld();
Location loc = new Location(w, Double.parseDouble(pos[0]), Double.parseDouble(pos[1]), Double.parseDouble(pos[2]));
e.getEntity().teleport(loc);
e.getEntity().setGameMode(GameMode.SPECTATOR);
task = Bukkit.getServer().getScheduler().runTaskTimer(Main.plugin, () -> {
int count = 5;
if(count == 0) {
task.cancel();
sendtitle("SusyBaka", e.getEntity());
e.getEntity().setGameMode(GameMode.SURVIVAL);
} else {
count--;
sendtitle(Integer.toString(count), e.getEntity());
}
}, 20, 20);
}
但是当我被杀时,我卡住了,因为 count 每秒都是一个新变量,它卡住了一个 5,我试图让 count 成为一个 public int 变量,但它只适用于 1 次死亡,否则是即时重生。 如何实现?
将 count
变量放在方法之外(即 public)是个好主意。实际上,你是这样做的:
- 计数 = 5。计数 -1 -> 4。
- 计数 = 5。计数 -1 -> 4。
- 计数 = 5。计数 -1 -> 4。
- 等...
您必须将计数器设置为 public,但也 link 给用户。你可以用地图来做。
还有一个更好的解决方案:在这种情况下不要使用 lambda,而是使用它:
@EventHandler
public void onPlayerDeath(PlayerDeathEvent e) {
// here your code
task = Bukkit.getServer().getScheduler().runTaskTimer(Main.plugin, new Runnable() {
// complete runnable instance instead of implicit one
private int count = 5; // counter define only for this runnable instance
@Override
public void run() {
if(count == 0) {
task.cancel();
// finished
} else {
count--; // here it will remove 1 but keep it for next iteration
sendtitle(Integer.toString(count), e.getEntity());
}
}
}, 20, 20);
}