簡體   English   中英

如何每 10 秒執行一次 function

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM