提供: Minecraft Modding Wiki
移動先: 案内検索

警告: ログインしていません。編集を行うと、あなたの IP アドレスが公開されます。ログインまたはアカウントを作成すれば、あなたの編集はその利用者名とともに表示されるほか、その他の利点もあります。

この編集を取り消せます。 下記の差分を確認して、本当に取り消していいか検証してください。よろしければ変更を保存して取り消しを完了してください。
最新版 編集中の文章
7行目: 7行目:
  
 
スケジューラを利用した実装は、次のような手順を踏んでください。
 
スケジューラを利用した実装は、次のような手順を踏んでください。
# まず、スケジューラにより実行される処理内容を、[[#BukkitRunnable|BukkitRunnable]] を継承したクラスの run()メソッドで実装します。
+
# まずスケジューラにより実行される処理内容を、[[#BukkitRunnable|BukkitRunnable]] を継承したクラスの run()メソッドで実装します。
# 次に、前のステップで実装したクラスをインスタンス化し、スケジュールをしたい箇所で、runTaskLaterメソッドやrunTaskTimerメソッドなどを実行するように設定します。
+
# Bukkit.getScheduler() でBukkitSchedulerを取得し、前のステップで実装したクラスを実行するように設定します。
  
 
== BukkitRunnable ==
 
== BukkitRunnable ==
  
 
BukkitRunnableは、 抽象クラスRunnableの実装クラスです。<br>
 
BukkitRunnableは、 抽象クラスRunnableの実装クラスです。<br>
Runnableに無い便利な機能として、自身の処理を再スケジュールしたり、キャンセルしたりできることです。
+
Runnableに無い便利な機能として、自身の処理を再スケジュールしたり、キャンセルしたりできることです。しかし、もしBukkitRunnableが自分自身をスケジュールしていない場合、自分自身でキャンセルを行うことができません。BukkitRunnableはスケジューラではないので、スケジューラのロジックを含んでいません。
  
=== 処理の実装例 ===
+
== 定義方法の例 ==
  
 
スケジューラの処理を定義するには、まず BukkitRunnable を extends しましょう。
 
スケジューラの処理を定義するには、まず BukkitRunnable を extends しましょう。
 +
 +
==== 具体例 ====
  
 
これはスケジュール処理のタスク定義の例です。
 
これはスケジュール処理のタスク定義の例です。
 
<blockquote><source lang="java">
 
<blockquote><source lang="java">
 
import org.bukkit.Bukkit;
 
import org.bukkit.Bukkit;
 +
import org.bukkit.plugin.java.JavaPlugin;
 
import org.bukkit.scheduler.BukkitRunnable;
 
import org.bukkit.scheduler.BukkitRunnable;
 
+
 
public class ExampleTask extends BukkitRunnable {
 
public class ExampleTask extends BukkitRunnable {
 
+
     @Override
+
     private final JavaPlugin plugin;
 +
 +
    public ExampleTask(JavaPlugin plugin) {
 +
        this.plugin = plugin;
 +
    }
 +
 
     public void run() {
 
     public void run() {
 
         // スケジュールで実行する処理の内容をここに書きます。
 
         // スケジュールで実行する処理の内容をここに書きます。
         Bukkit.broadcastMessage("サーバーへようこそ!説明文をちゃんと読んでね!");
+
         plugin.getServer().broadcastMessage("サーバーへようこそ!説明文をちゃんと読んでね!");
 
     }
 
     }
 
}
 
}
 
</source></blockquote>
 
</source></blockquote>
  
=== 実装した処理のスケジューリング ===
+
 
 +
== 作業のスケジューリング ==
  
 
タスクを定義した後、プラグインは、タスクをスケジュールする必要があります。<br>
 
タスクを定義した後、プラグインは、タスクをスケジュールする必要があります。<br>
41行目: 50行目:
 
これらのメソッドは共通して、BukkitTaskクラスのオブジェクトを返します。
 
これらのメソッドは共通して、BukkitTaskクラスのオブジェクトを返します。
  
これは、プレイヤーがログインしたら、20ticks(=1秒)後にタスクを実行するスケジューラを登録する実装例です。
+
{{warning}} '''非同期実行タスクは、BukkitのAPIを直接実行してはいけません。'''
<blockquote><source lang="java">
 
import org.bukkit.event.EventHandler;
 
import org.bukkit.event.Listener;
 
import org.bukkit.event.player.PlayerJoinEvent;
 
import org.bukkit.plugin.java.JavaPlugin;
 
 
 
public class ExamplePlugin extends JavaPlugin implements Listener {
 
 
 
    @Override
 
    public void onEnable() {
 
        getServer().getPluginManager().registerEvents(this, this);
 
    }
 
  
    @EventHandler
+
==== 具体例 ====
    public void onJoin(PlayerJoinEvent event) {
 
        // BukkitRunnableを継承したExampleTaskを生成し、
 
        // runTaskLater メソッドで20ticks後に実行するように設定します。
 
        new ExampleTask().runTaskLater(this, 20);
 
    }
 
}
 
</source></blockquote>
 
 
 
== 自己キャンセルの実装例 ==
 
 
 
今度は、プレイヤーがログインしたら、10ticks待った後、20ticksごとに5回実行し、その後スケジューラの処理をキャンセルする例を示します。
 
 
 
'''ExampleSelfCancelingTask.java'''
 
 
 
<blockquote><source lang="java">
 
import org.bukkit.plugin.java.JavaPlugin;
 
import org.bukkit.scheduler.BukkitRunnable;
 
 
 
public class ExampleSelfCancelingTask extends BukkitRunnable {
 
 
 
    private final JavaPlugin plugin;
 
 
 
    private int counter;
 
 
 
    public ExampleSelfCancelingTask(JavaPlugin plugin, int counter) {
 
        this.plugin = plugin;
 
        if (counter < 1) {
 
            throw new IllegalArgumentException("counter には1以上を指定してください。");
 
        } else {
 
            this.counter = counter;
 
        }
 
    }
 
 
 
    @Override
 
    public void run() {
 
        // ここに、スケジュールの処理内容を実装します。
 
        if (counter > 0) {
 
            plugin.getServer().broadcastMessage("広告が表示されるまで、あと " + counter-- + "秒");
 
        } else {
 
            plugin.getServer().broadcastMessage("サーバーへようこそ!説明文をちゃんと読んでね!");
 
            this.cancel();
 
        }
 
    }
 
}
 
</source></blockquote>
 
 
 
 
 
'''ExamplePlugin.java'''
 
  
 +
これは、20ticks(=1秒)後にタスクを実行するスケジューラを登録する実装例です。
 
<blockquote><source lang="java">
 
<blockquote><source lang="java">
 
import org.bukkit.event.EventHandler;
 
import org.bukkit.event.EventHandler;
110行目: 60行目:
 
import org.bukkit.event.player.PlayerJoinEvent;
 
import org.bukkit.event.player.PlayerJoinEvent;
 
import org.bukkit.plugin.java.JavaPlugin;
 
import org.bukkit.plugin.java.JavaPlugin;
 
+
import org.bukkit.scheduler.BukkitRunnable;
public final class ExamplePlugin extends JavaPlugin implements Listener {
+
import org.bukkit.scheduler.BukkitTask;
 
+
 +
public final class ExamplePlugin extends JavaPlugin {
 +
 
     @Override
 
     @Override
 
     public void onEnable() {
 
     public void onEnable() {
        getServer().getPluginManager().registerEvents(this, this);
+
         new ExampleListener(this);
    }
 
 
 
    @EventHandler
 
    public void onJoin(PlayerJoinEvent event) {
 
        // スケジューリングする
 
         new ExampleSelfCancelingTask(this, 5).runTaskTimer(this, 10, 20);
 
 
     }
 
     }
 
}
 
}
</source></blockquote>
+
 
+
class ExampleListener implements Listener {
== 無名クラスを使用した実装例 ==
+
 
+
     private final ExamplePlugin plugin;
毎回BukkitRunnableを継承したクラスを作成していると大変なので、BukkitRunnableを無名クラスとして内部に実装した例も示します。<br>
+
無名クラスを理解している場合は、こちらを使っても構いません。
+
     public ExampleListener(ExamplePlugin plugin) {
 
+
         this.plugin = plugin;
<blockquote><source lang="java">
+
        plugin.getServer().getPluginManager().registerEvents(this, plugin);
import org.bukkit.event.EventHandler;
 
import org.bukkit.event.Listener;
 
import org.bukkit.event.player.PlayerJoinEvent;
 
import org.bukkit.plugin.java.JavaPlugin;
 
import org.bukkit.scheduler.BukkitRunnable;
 
 
 
public final class ExamplePlugin extends JavaPlugin implements Listener {
 
 
 
     @Override
 
     public void onEnable() {
 
         getServer().getPluginManager().registerEvents(this, this);
 
 
     }
 
     }
 
+
 
     @EventHandler
 
     @EventHandler
 
     public void onJoin(PlayerJoinEvent event) {
 
     public void onJoin(PlayerJoinEvent event) {
         // 20ticks後に1度だけ実行される処理を、実装しつつ、そのままスケジュールします。
+
         BukkitTask task = new ExampleTask(this).runTaskLater(plugin, 20);
       
 
        new BukkitRunnable() {
 
 
 
            @Override
 
            public void run() {
 
                // スケジューラで実行される処理内容を、ここに実装します。
 
                getServer().broadcastMessage(
 
                    "サーバーへようこそ!説明文をちゃんと読んでね!");
 
            }
 
        }.runTaskLater(this, 20);
 
        // ↑そのままスケジュールします。
 
 
     }
 
     }
 
}
 
}
166行目: 90行目:
  
 
BukkitSchedulerは、[http://docs.oracle.com/javase/1.5.0/docs/api/index.html?java/lang/Runnable.html Runnable]クラスや[http://docs.oracle.com/javase/1.5.0/docs/api/index.html?java/util/concurrent/Callable.html Callable]クラスの、どちらかまたは両方を実装したクラスを、一定時間後に実行する機能を提供します。<br>
 
BukkitSchedulerは、[http://docs.oracle.com/javase/1.5.0/docs/api/index.html?java/lang/Runnable.html Runnable]クラスや[http://docs.oracle.com/javase/1.5.0/docs/api/index.html?java/util/concurrent/Callable.html Callable]クラスの、どちらかまたは両方を実装したクラスを、一定時間後に実行する機能を提供します。<br>
詳細は、[http://jd.bukkit.org/rb/apidocs/index.html?org/bukkit/scheduler/BukkitScheduler.html BukkitSchedulerのjavadoc] を参照してください。<br>
+
詳細は、[http://jd.bukkit.org/rb/apidocs/index.html?org/bukkit/scheduler/BukkitScheduler.html BukkitSchedulerのjavadoc] を参照してください。
なお、BukkitSchedulerのメソッドで実行できる内容は、BukkitRunnableのメソッドで実行できる内容と全く同じです。
 
 
 
{{warning}} ただし、BukkitSchedulerでBukkitRunnableを実行することも可能ですが、BukkitRunnableのcancel()メソッドを使ってスケジューラをキャンセルすることができないことに注意してください。<br>
 
{{warning}} この実装方法は、CraftBukkit 1.7.10-R0.1 で非推奨に設定されました。今後は前述のBukkitRunnableのメソッドを呼び出す方法を使用してください。
 
 
 
=== 実装例1 ===
 
 
 
無名クラスでRunnableを実装し、20ticks後に実行される例を示します。
 
<blockquote><source lang="java">
 
import org.bukkit.Bukkit;
 
import org.bukkit.plugin.java.JavaPlugin;
 
import org.bukkit.scheduler.BukkitScheduler;
 
  
public final class ExamplePlugin extends JavaPlugin {
+
{{warning}} '''非同期実行タスクは、BukkitのAPIを直接実行してはいけません。'''
    public void onEnable() {
 
        BukkitScheduler scheduler = Bukkit.getServer().getScheduler();
 
        scheduler.scheduleSyncDelayedTask(this, new Runnable() {
 
            @Override
 
            public void run() {
 
                // ここに処理を実装する。
 
            }
 
        }, 20L);
 
    }
 
}
 
</source></blockquote>
 
 
 
=== 実行例2 ===
 
 
 
無名クラスでRunnableを実装し、20ticksごとにプラグインが終了するまでずっと実行され続ける例を示します。
 
<blockquote><source lang="java">
 
import org.bukkit.Bukkit;
 
import org.bukkit.plugin.java.JavaPlugin;
 
import org.bukkit.scheduler.BukkitScheduler;
 
 
 
public final class ExamplePlugin extends JavaPlugin {
 
    public void onEnable() {
 
        BukkitScheduler scheduler = Bukkit.getServer().getScheduler();
 
        scheduler.scheduleSyncRepeatingTask(this, new Runnable() {
 
            @Override
 
            public void run() {
 
                // ここに処理を実装する。
 
            }
 
        }, 0L, 20L);
 
    }
 
}
 
</source></blockquote>
 
  
 
=== BukkitTask ===
 
=== BukkitTask ===

Minecraft Modding Wikiへの投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。 自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。
また、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細はMinecraft Modding Wiki:著作権を参照)。 著作権保護されている作品は、許諾なしに投稿しないでください!

このページを編集するには、下記の確認用の質問に回答してください (詳細):

取り消し 編集の仕方 (新しいウィンドウで開きます)

このページで使用されているテンプレート: