14

60 分ごとに関数を呼び出す簡単な方法が必要です。これどうやってするの?私は MineCraft bukkit プラグインを作成しています。これが私が持っているものです:

package com.webs.playsoulcraft.plazmotech.java.MineRegen;

import java.util.logging.Logger;

import org.bukkit.Location;
import org.bukkit.block.Block;
import org.bukkit.event.block.Action;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.plugin.java.JavaPlugin;


public class Main extends JavaPlugin{

    public final Logger log = Logger.getLogger("Minecraft");


    @Override
    public void onEnable() {
        this.log.info("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
        this.log.info("Plaz's Mine Regen is now enabled!");
        this.log.info("Copyright 2012 Plazmotech Co. All rights reserved.");
        this.log.info("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
    }

    @Override 
    public void onDisable() {
        this.log.info("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
        this.log.info("Plaz's Mine Regen is now disabled!");
        this.log.info("Copyright 2012 Plazmotech Co. All rights reserved.");
        this.log.info("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
    }

    public void onPlayerInteract(PlayerInteractEvent event) {
        final Action action = event.getAction();
        if (action == Action.LEFT_CLICK_BLOCK) {
            Location l1 = event.getClickedBlock().getLocation();
        } else if (action == Action.RIGHT_CLICK_BLOCK) {
            Location l2 = event.getClickedBlock().getLocation();
        }
    }
}

1 時間ごとに実装する関数を実行する必要があります。注意: この関数は l1 と l2 を使用します。また、これをループしてすべてのブロックを間に入れるにはどうすればよいですか?

4

4 に答える 4

28

Timerオブジェクトを作成し、TimerTask実行したいコードを実行する を与えます。

Timer timer = new Timer ();
TimerTask hourlyTask = new TimerTask () {
    @Override
    public void run () {
        // your code here...
    }
};

// schedule the task to run starting now and then every hour...
timer.schedule (hourlyTask, 0l, 1000*60*60);

hourlyTask関数内で宣言すると、 and にonPlayerInteractアクセスできます。それをコンパイルするには、両方を としてマークする必要があります。l1l2final

オブジェクトを使用する利点は、それぞれが独自のタイミング、遅延などを持つTimer複数のオブジェクトを処理できることです。クラス変数などとして宣言することによりTimerTask、オブジェクトを保持している限り、タイマーを開始および停止することもできます。Timer.

間にすべてのブロックを取得する方法がわかりません。

于 2012-05-25T03:53:32.213 に答える
4

永久に実行され、1 時間ごとに起動してデータを実行するスレッドを作成します。

Thread t = new Thread() {
    @Override
    public void run() {
        while(true) {
            try {
                Thread.sleep(1000*60*60);
                //your code here...
            } catch (InterruptedException ie) {
            }
        }
    }
};
t.start();
于 2012-05-25T03:47:35.307 に答える
3

Bukkit スケジューラを使用する必要があります。

public void Method(){
    this.getServer().getScheduler().scheduleSyncDelayedTask(this, new Runnable() {
        @Override
        public void run() {
            // Your code goes here
            Method();
        }
    }, time * 20L );
}

これを使用してメソッドを作成し、そこで同じメソッドを呼び出す必要があります。

于 2013-03-31T17:00:09.340 に答える
1
  1. (私の意見では)最も簡単な方法は使用ですThread(上記のコメントで言及されています)。
  2. Timer で使用することもできますjavax.swing.Timer
  3. しかし、101100 が言ったように、使用できると思いますTimerTask。このリンクを確認できます (IBMから)
于 2012-05-25T04:30:52.290 に答える