[英]How to execute a function every 10 seconds
我正在為我即將推出的 Minecraft 服務器制作一個插件。 我需要一種每 10 秒執行一次 function 的方法。
我對插件開發和 Java 還很陌生。如果有人能幫助我,我將不勝感激。
這是我的代碼:
public void endGame(){
for (int y=0;y<256;y++){
for (int x=0;x<384;x++){
for (int z=0;z<384;z++) {
Location loc = new Location(Bukkit.getServer().getWorld(player.getWorld().getName()), x, y, z);
loc.getBlock().setType(Material.REDSTONE_BLOCK);
return true;
}
}
}
}
我試過的是:
public void endGame(){
for (int y=0;y<256;y++){
for (int x=0;x<384;x++){
for (int z=0;z<384;z++) {
try{
Thread.sleep(10000);
Location loc = new Location(Bukkit.getServer().getWorld(player.getWorld().getName()), x, y, z);
loc.getBlock().setType(Material.REDSTONE_BLOCK);
return true;
}
catch (Exception e){
System.out.println(e);
}
}
}
}
}
您可以使用 BukkitRunnable 進行任務調度。
new BukkitRunnable().runTaskTimer(plugin,20*10,20*10);
BukkitRunnable 是抽象的,所以你必須重寫
@Override
public void run() {
}
方法。 每當執行任務時都會運行此方法。 上面的runTaskTimer()
方法有 3 個參數:一個插件實例,一個定義第一次執行之前的延遲的長整數,另一個長整數是執行之間的時間。 時間以游戲刻度(1/20 秒)計算。 您可以閱讀javadoc和官方教程以獲取有關調度的更多信息。
如果您以任何方式與 bukkit 環境交互(修改),強烈建議僅在主線程中進行。 否則,您也可以使用runTaskTimerAsynchronously
方法。
為什么你的代碼不起作用
您的代碼在主線程上執行。 該線程基本上處理與游戲相關的所有動作,包括方塊修改、實體移動和玩家交互。 當您調用 Thread.sleep() 時,您凍結了整個游戲。 如果你要創建一個新線程並讓它休眠 10 秒,它會工作,但你將無法修改世界,因為你的線程不會與主線程同步。
我有一個關於如何做到這一點的要點。 創建一個 class:
import org.bukkit.Bukkit;
import org.bukkit.plugin.java.JavaPlugin;
public abstract class RepeatingTask implements Runnable {
private int taskId;
public RepeatingTask(JavaPlugin plugin, int initialDelay, int repeatDelay) {
this.taskId = Bukkit.getScheduler().scheduleSyncRepeatingTask(plugin, this, (long)initialDelay, (long)repeatDelay);
}
public void cancelLoop() {
Bukkit.getScheduler().cancelTask(this.taskId);
}
}
與僅使用Bukkit.getScheduler().scheduleSyncRepeatingTask()
創建循環不同,您實際上可以使用此 class 取消循環。arguments 均以滴答為單位。 (1 秒 = 20 個刻度)
class的用法:
RepeatingTask repeatingTask = new RepeatingTask(this, 0, 20) {
@Override
public void run() {
cancelLoop();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.