├── .gitignore ├── LICENSE ├── Part0-9 ├── Part1 │ ├── README.md │ └── pom.xml ├── Part2 │ ├── README.md │ ├── pom.xml │ └── src │ │ └── main │ │ ├── java │ │ └── jp │ │ │ └── jyn │ │ │ └── part2 │ │ │ └── Main.java │ │ └── resources │ │ └── plugin.yml ├── Part3 │ ├── README.md │ ├── pom.xml │ └── src │ │ └── main │ │ ├── java │ │ └── jp │ │ │ └── jyn │ │ │ └── part3 │ │ │ └── Main.java │ │ └── resources │ │ └── plugin.yml ├── Part4 │ ├── README.md │ ├── pom.xml │ └── src │ │ └── main │ │ ├── java │ │ └── jp │ │ │ └── jyn │ │ │ └── part4 │ │ │ └── Main.java │ │ └── resources │ │ └── plugin.yml ├── Part5 │ ├── README.md │ ├── pom.xml │ └── src │ │ └── main │ │ ├── java │ │ └── jp │ │ │ └── jyn │ │ │ └── part5 │ │ │ ├── Command.java │ │ │ ├── Main.java │ │ │ └── subcommands │ │ │ ├── Fuga.java │ │ │ ├── Help.java │ │ │ └── Piyo.java │ │ └── resources │ │ └── plugin.yml ├── Part6 │ ├── README.md │ ├── pom.xml │ └── src │ │ └── main │ │ ├── java │ │ └── jp │ │ │ └── jyn │ │ │ └── part6 │ │ │ ├── BlockPlace.java │ │ │ └── Main.java │ │ └── resources │ │ └── plugin.yml ├── Part7 │ ├── README.md │ ├── pom.xml │ └── src │ │ └── main │ │ ├── java │ │ └── jp │ │ │ └── jyn │ │ │ └── part7 │ │ │ ├── Config.java │ │ │ └── Main.java │ │ └── resources │ │ ├── config.yml │ │ └── plugin.yml ├── Part8 │ ├── README.md │ ├── pom.xml │ └── src │ │ └── main │ │ ├── java │ │ └── jp │ │ │ └── jyn │ │ │ └── part8 │ │ │ ├── CustomConfig.java │ │ │ └── Main.java │ │ └── resources │ │ ├── config.yml │ │ ├── message.yml │ │ └── plugin.yml └── Part9 │ ├── README.md │ ├── pom.xml │ └── src │ └── main │ ├── java │ └── jp │ │ └── jyn │ │ └── part9 │ │ └── Main.java │ └── resources │ └── plugin.yml ├── Part10-19 ├── Part10 │ ├── README.md │ ├── pom.xml │ └── src │ │ └── main │ │ ├── java │ │ └── jp │ │ │ └── jyn │ │ │ └── part10 │ │ │ └── Main.java │ │ └── resources │ │ └── plugin.yml ├── Part11 │ ├── README.md │ ├── pom.xml │ └── src │ │ └── main │ │ ├── java │ │ └── jp │ │ │ └── jyn │ │ │ └── part11 │ │ │ └── Main.java │ │ └── resources │ │ └── plugin.yml └── Part12 │ ├── README.md │ ├── pom.xml │ └── src │ └── main │ ├── java │ └── jp │ │ └── jyn │ │ └── part12 │ │ └── Main.java │ └── resources │ └── plugin.yml └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | *.class 2 | 3 | # Mobile Tools for Java (J2ME) 4 | .mtj.tmp/ 5 | 6 | # Package Files # 7 | *.jar 8 | *.war 9 | *.ear 10 | 11 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 12 | hs_err_pid* 13 | 14 | # Eclipse 15 | .project 16 | .classpath 17 | .settings 18 | 19 | # OS 20 | Thumbs.db 21 | .DS_Store 22 | 23 | # Maven 24 | dependency-reduced-pom.xml 25 | target/ 26 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Zlib License 2 | 3 | Copyright (c) 2016 HimaJyun 4 | 5 | This software is provided 'as-is', without any express or implied 6 | warranty. In no event will the authors be held liable for any damages 7 | arising from the use of this software. 8 | 9 | Permission is granted to anyone to use this software for any purpose, 10 | including commercial applications, and to alter it and redistribute it 11 | freely, subject to the following restrictions: 12 | 13 | 1. The origin of this software must not be misrepresented; you must not 14 | claim that you wrote the original software. If you use this software 15 | in a product, an acknowledgment in the product documentation would be 16 | appreciated but is not required. 17 | 18 | 2. Altered source versions must be plainly marked as such, and must not be 19 | misrepresented as being the original software. 20 | 21 | 3. This notice may not be removed or altered from any source 22 | distribution. 23 | -------------------------------------------------------------------------------- /Part0-9/Part1/README.md: -------------------------------------------------------------------------------- 1 | # 其之一-プロジェクトの作成迄 2 | プロジェクトの作成、ここはあんまり意味ないかも、記事読む方が良い 3 | 記事は[[Bukkitプラグイン制作講座-其之一]プロジェクトの作成迄](https://jyn.jp/bukkit-plugin-development-1/)でご覧いただける 4 | -------------------------------------------------------------------------------- /Part0-9/Part1/pom.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | UTF-8 5 | 1.7 6 | 7 | 4.0.0 8 | jp.jyn 9 | Part1 10 | 0.0.1-SNAPSHOT 11 | 12 | 13 | 14 | org.apache.maven.plugins 15 | maven-compiler-plugin 16 | 3.5.1 17 | 18 | ${java.version} 19 | ${java.version} 20 | 21 | 22 | 23 | 24 | 25 | 26 | spigot-repo 27 | https://hub.spigotmc.org/nexus/content/groups/public/ 28 | 29 | 30 | 31 | 32 | org.spigotmc 33 | spigot-api 34 | 1.10.2-R0.1-SNAPSHOT 35 | 36 | 37 | -------------------------------------------------------------------------------- /Part0-9/Part2/README.md: -------------------------------------------------------------------------------- 1 | # 其之二-メインクラスの作成、ビルド迄 2 | メインクラスをBukkitに認識させるまで 3 | 記事は[[Bukkitプラグイン制作講座-其之二]メインクラスの作成、ビルド迄](https://jyn.jp/bukkit-plugin-development-2/)でご覧いただける 4 | -------------------------------------------------------------------------------- /Part0-9/Part2/pom.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | UTF-8 5 | 1.7 6 | 7 | 4.0.0 8 | jp.jyn 9 | Part2 10 | 0.0.1-SNAPSHOT 11 | 12 | 13 | 14 | org.apache.maven.plugins 15 | maven-compiler-plugin 16 | 3.5.1 17 | 18 | ${java.version} 19 | ${java.version} 20 | 21 | 22 | 23 | 24 | 25 | . 26 | true 27 | src/main/resources/ 28 | 29 | 30 | 31 | 32 | 33 | spigot-repo 34 | https://hub.spigotmc.org/nexus/content/groups/public/ 35 | 36 | 37 | 38 | 39 | org.spigotmc 40 | spigot-api 41 | 1.10.2-R0.1-SNAPSHOT 42 | 43 | 44 | -------------------------------------------------------------------------------- /Part0-9/Part2/src/main/java/jp/jyn/part2/Main.java: -------------------------------------------------------------------------------- 1 | package jp.jyn.part2; 2 | 3 | import org.bukkit.plugin.java.JavaPlugin; 4 | 5 | public class Main extends JavaPlugin { 6 | 7 | @Override 8 | public void onEnable() { 9 | getLogger().info("Hello, world!"); 10 | } 11 | 12 | } 13 | -------------------------------------------------------------------------------- /Part0-9/Part2/src/main/resources/plugin.yml: -------------------------------------------------------------------------------- 1 | main: jp.jyn.part2.Main 2 | name: "${project.artifactId}" 3 | version: "${project.version}" 4 | website: "https://jyn.jp/bukkit-plugin-development-2/" 5 | author: "@HimaJyun" 6 | 7 | # GitHub掲載の都合で記事と微妙に違うけど気にしないで。 -------------------------------------------------------------------------------- /Part0-9/Part3/README.md: -------------------------------------------------------------------------------- 1 | # 其之三-コマンドに応答する 2 | 基本的なコマンドの使い方 3 | 記事は[[Bukkitプラグイン制作講座-其之三]コマンドに応答する](https://jyn.jp/bukkit-plugin-development-3/)でご覧いただける 4 | -------------------------------------------------------------------------------- /Part0-9/Part3/pom.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | UTF-8 5 | 1.7 6 | 7 | 4.0.0 8 | jp.jyn 9 | Part3 10 | 0.0.1-SNAPSHOT 11 | 12 | 13 | 14 | org.apache.maven.plugins 15 | maven-compiler-plugin 16 | 3.5.1 17 | 18 | ${java.version} 19 | ${java.version} 20 | 21 | 22 | 23 | 24 | 25 | . 26 | true 27 | src/main/resources/ 28 | 29 | 30 | 31 | 32 | 33 | spigot-repo 34 | https://hub.spigotmc.org/nexus/content/groups/public/ 35 | 36 | 37 | 38 | 39 | org.spigotmc 40 | spigot-api 41 | 1.10.2-R0.1-SNAPSHOT 42 | 43 | 44 | -------------------------------------------------------------------------------- /Part0-9/Part3/src/main/java/jp/jyn/part3/Main.java: -------------------------------------------------------------------------------- 1 | package jp.jyn.part3; 2 | 3 | import org.bukkit.command.Command; 4 | import org.bukkit.command.CommandSender; 5 | import org.bukkit.plugin.java.JavaPlugin; 6 | 7 | public class Main extends JavaPlugin { 8 | 9 | @Override 10 | public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { 11 | // 引数を取得 12 | String subCommand = args.length == 0 ? "" : args[0]; 13 | 14 | if (command.getName().equalsIgnoreCase("sample")) { // sampleコマンドの場合 15 | 16 | if (subCommand.equalsIgnoreCase("a")) { // /sample aの場合 17 | sender.sendMessage("/sample aコマンドを実行しました!!"); 18 | } else if (subCommand.equalsIgnoreCase("b")) { // /sample bの場合 19 | sender.sendMessage("/sample bコマンドを実行しました"); 20 | } else { // それ以外の時は使い方を表示 21 | sender.sendMessage(new String[] { 22 | "/sample a - aCommand", 23 | "/sample b - bCommand" 24 | }); 25 | } 26 | 27 | } else if (command.getName().equalsIgnoreCase("example")) { // exampleコマンドの場合 28 | 29 | if (subCommand.equalsIgnoreCase("a")) { // /example aの場合 30 | sender.sendMessage("/example aコマンドを実行しました!!"); 31 | } else if (subCommand.equalsIgnoreCase("b")) { // /example bの場合 32 | sender.sendMessage("/example bコマンドを実行しました"); 33 | } else { // それ以外の時は使い方を表示 34 | sender.sendMessage(new String[] { 35 | "/example a - aCommand", 36 | "/example b - bCommand" 37 | }); 38 | } 39 | 40 | } 41 | return true; 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /Part0-9/Part3/src/main/resources/plugin.yml: -------------------------------------------------------------------------------- 1 | main: jp.jyn.part3.Main 2 | name: "${project.artifactId}" 3 | version: "${project.version}" 4 | website: "https://jyn.jp/bukkit-plugin-development-3/" 5 | author: "@HimaJyun" 6 | 7 | commands: 8 | sample: 9 | description: 'Sample command.' 10 | example: 11 | description: 'Example command.' 12 | -------------------------------------------------------------------------------- /Part0-9/Part4/README.md: -------------------------------------------------------------------------------- 1 | # 其之四-もっとコマンド!! 2 | コマンドに対する権限設定や、プレイヤー/コンソールの判定など、基本的な事 3 | 記事は[[Bukkitプラグイン制作講座-其之四]もっとコマンド!!](https://jyn.jp/bukkit-plugin-development-4/)でご覧いただける 4 | -------------------------------------------------------------------------------- /Part0-9/Part4/pom.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | UTF-8 5 | 1.7 6 | 7 | 4.0.0 8 | jp.jyn 9 | Part4 10 | 0.0.1-SNAPSHOT 11 | 12 | 13 | 14 | org.apache.maven.plugins 15 | maven-compiler-plugin 16 | 3.5.1 17 | 18 | ${java.version} 19 | ${java.version} 20 | 21 | 22 | 23 | 24 | 25 | . 26 | true 27 | src/main/resources/ 28 | 29 | 30 | 31 | 32 | 33 | spigot-repo 34 | https://hub.spigotmc.org/nexus/content/groups/public/ 35 | 36 | 37 | 38 | 39 | org.spigotmc 40 | spigot-api 41 | 1.10.2-R0.1-SNAPSHOT 42 | 43 | 44 | -------------------------------------------------------------------------------- /Part0-9/Part4/src/main/java/jp/jyn/part4/Main.java: -------------------------------------------------------------------------------- 1 | package jp.jyn.part4; 2 | 3 | import org.bukkit.command.Command; 4 | import org.bukkit.command.CommandSender; 5 | import org.bukkit.entity.Player; 6 | import org.bukkit.plugin.java.JavaPlugin; 7 | 8 | public class Main extends JavaPlugin { 9 | 10 | @Override 11 | public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { 12 | // 権限チェックは先に済ませてしまうと良いでしょう。 13 | // (コンソールはOPとして扱われる?ので常に権限を持つ) 14 | if (!sender.hasPermission("part4.op")) { // 権限を「持たない」を確認する時は「!(not)」を付けるのを忘れずに 15 | sender.sendMessage("あんたには使えないよ!!"); 16 | return true; 17 | } 18 | 19 | // これは不可能 20 | //sender.getLocation(); 21 | 22 | // コマンドを使ったのがプレイヤーかどうか確認する 23 | Player player = null; 24 | if (sender instanceof Player) { // プレイヤー 25 | // senderをPlayer型に型変換(ダウンキャスト)する 26 | player = (Player) sender; 27 | } else { // コンソール 28 | // コンソールからは使えないコマンドなのでエラーを出力して終わり 29 | sender.sendMessage("このコマンドはコンソールからは使えません!!"); 30 | return true; 31 | } 32 | 33 | // ここで適当に何かする 34 | player.damage(9999); 35 | 36 | return true; 37 | } 38 | 39 | /* 40 | コメントアウトの小技 41 | この様に、*/の前に//を付けると 42 | /*を//*にするだけでまとめて有効/無効を切り替え出来る 43 | //*/ 44 | } 45 | -------------------------------------------------------------------------------- /Part0-9/Part4/src/main/resources/plugin.yml: -------------------------------------------------------------------------------- 1 | main: jp.jyn.part4.Main 2 | name: "${project.artifactId}" 3 | version: "${project.version}" 4 | website: "https://jyn.jp/bukkit-plugin-development-4/" 5 | author: "@HimaJyun" 6 | 7 | commands: 8 | hoge: 9 | description: 'This command can only be run by a player.' 10 | 11 | permissions: 12 | # プレイヤーのコマンド 13 | part4.player: 14 | default: true 15 | # OP用のコマンド 16 | part4.op: 17 | default: op 18 | # 上2つをまとめたもの 19 | part4.* 20 | children: 21 | part4.op: true 22 | part4.player: true -------------------------------------------------------------------------------- /Part0-9/Part5/README.md: -------------------------------------------------------------------------------- 1 | # 其之五-コマンド、時々クラス分割 2 | 其之五、コマンドの処理を別のクラスに切り出す方法(+[@HimaJyun](https://twitter.com/HimaJyun)がやってるサブコマンドのクラス分け付き) 3 | 記事は[[Bukkitプラグイン制作講座-其之五]コマンド、時々クラス分割](https://jyn.jp/bukkit-plugin-development-5/)でご覧いただける 4 | -------------------------------------------------------------------------------- /Part0-9/Part5/pom.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | UTF-8 5 | 1.7 6 | 7 | 4.0.0 8 | jp.jyn 9 | Part5 10 | 0.0.1-SNAPSHOT 11 | 12 | 13 | 14 | org.apache.maven.plugins 15 | maven-compiler-plugin 16 | 3.5.1 17 | 18 | ${java.version} 19 | ${java.version} 20 | 21 | 22 | 23 | 24 | 25 | . 26 | true 27 | src/main/resources/ 28 | 29 | 30 | 31 | 32 | 33 | spigot-repo 34 | https://hub.spigotmc.org/nexus/content/groups/public/ 35 | 36 | 37 | 38 | 39 | org.spigotmc 40 | spigot-api 41 | 1.10.2-R0.1-SNAPSHOT 42 | 43 | 44 | -------------------------------------------------------------------------------- /Part0-9/Part5/src/main/java/jp/jyn/part5/Command.java: -------------------------------------------------------------------------------- 1 | package jp.jyn.part5; 2 | 3 | import java.util.HashMap; 4 | import java.util.Locale; 5 | import java.util.Map; 6 | 7 | import org.bukkit.command.CommandExecutor; 8 | import org.bukkit.command.CommandSender; 9 | 10 | import jp.jyn.part5.subcommands.Fuga; 11 | import jp.jyn.part5.subcommands.Help; 12 | import jp.jyn.part5.subcommands.Piyo; 13 | 14 | /** 15 | * コマンドのメインクラス(/hogeコマンドを分岐する) 16 | * @author HimaJyun 17 | * 18 | */ 19 | public class Command implements CommandExecutor { 20 | 21 | // サブコマンドが詰まってる 22 | private Map sub = new HashMap<>(); 23 | 24 | // 引数がない場合の処理(空白を含むなどして引数としてありえない形にしておきましょう(衝突防止)) 25 | private final String NO_ARGS = "NO ARGS"; 26 | // もしくは、helpとして扱っても良いかも知れません。(と言うか普通はそれで良い) 27 | //private final String NO_ARGS = "help"; 28 | 29 | /** 30 | * コンストラクタ(ここでサブコマンドを登録) 31 | */ 32 | public Command() { 33 | sub.put("fuga", new Fuga()); // /hoge fugaコマンドはFugaクラスに任せる 34 | sub.put("piyo", new Piyo()); // /hoge piyoコマンドはPiyoクラスに任せる 35 | 36 | // サブコマンドがなかった場合はHelpを表示、とかにしておくと良い 37 | sub.put(NO_ARGS, new Help()); 38 | } 39 | 40 | @Override 41 | public boolean onCommand(CommandSender sender, org.bukkit.command.Command command, String label, String[] args) { 42 | if (0 < args.length) { // 引数がある 43 | // 1つめの引数(args[0])を小文字に変換する(/hoge fugaでも/hoge FUGAでも実行出来る様に) 44 | String subCommand = args[0].toLowerCase(Locale.ENGLISH); 45 | // そのサブコマンドに対応したExecutorを取得する 46 | CommandExecutor executor = sub.get(subCommand); 47 | 48 | // 非null == サブコマンドが登録されていたなら実行する 49 | // containsKeyでチェックする必要はない(HashMapのcontainsKey自体がgetして非nullならtrue、みたいな実装になっている) 50 | if (command != null) { 51 | // 実行して終了する 52 | return executor.onCommand(sender, command, label, args); 53 | } 54 | } 55 | 56 | // ここまで来た==サブコマンドがなかったか、登録されていなかった時は 57 | // 引数がない時の処理(helpを表示)を実行する 58 | return sub.get(NO_ARGS).onCommand(sender, command, label, args); 59 | } 60 | 61 | } 62 | -------------------------------------------------------------------------------- /Part0-9/Part5/src/main/java/jp/jyn/part5/Main.java: -------------------------------------------------------------------------------- 1 | package jp.jyn.part5; 2 | 3 | import org.bukkit.plugin.java.JavaPlugin; 4 | 5 | public class Main extends JavaPlugin { 6 | 7 | @Override 8 | public void onEnable() { 9 | // hogeコマンドの処理をCommandクラスに任せる 10 | getCommand("hoge").setExecutor(new Command()); 11 | } 12 | 13 | @Override 14 | public void onDisable() { 15 | // 登録解除したい時は(多分)こうすればいい 16 | getCommand("hoge").setExecutor(this); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Part0-9/Part5/src/main/java/jp/jyn/part5/subcommands/Fuga.java: -------------------------------------------------------------------------------- 1 | package jp.jyn.part5.subcommands; 2 | 3 | import org.bukkit.command.Command; 4 | import org.bukkit.command.CommandExecutor; 5 | import org.bukkit.command.CommandSender; 6 | 7 | /** 8 | * 「/hoge fuga」コマンドを処理するクラス 9 | * @author HimaJyun 10 | * 11 | */ 12 | public class Fuga implements CommandExecutor { 13 | 14 | @Override 15 | public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { 16 | sender.sendMessage("あなたは「/hoge fuga」コマンドを実行しました!!"); 17 | return true; 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /Part0-9/Part5/src/main/java/jp/jyn/part5/subcommands/Help.java: -------------------------------------------------------------------------------- 1 | package jp.jyn.part5.subcommands; 2 | 3 | import org.bukkit.command.Command; 4 | import org.bukkit.command.CommandExecutor; 5 | import org.bukkit.command.CommandSender; 6 | 7 | /** 8 | * ヘルプコマンド 9 | * @author HimaJyun 10 | * 11 | */ 12 | public class Help implements CommandExecutor { 13 | 14 | @Override 15 | public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { 16 | sender.sendMessage(new String[] { 17 | "このプラグインでは以下のコマンドが使えます!!", 18 | "/hoge fuga - fugaコマンド", 19 | "/hoge piyo - piyoコマンド", 20 | "/hoge help - このヘルプを表示します" 21 | }); 22 | 23 | return true; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /Part0-9/Part5/src/main/java/jp/jyn/part5/subcommands/Piyo.java: -------------------------------------------------------------------------------- 1 | package jp.jyn.part5.subcommands; 2 | 3 | import org.bukkit.command.Command; 4 | import org.bukkit.command.CommandExecutor; 5 | import org.bukkit.command.CommandSender; 6 | 7 | /** 8 | * 「/hoge piyo」コマンドを処理するクラス 9 | * @author HimaJyun 10 | * 11 | */ 12 | public class Piyo implements CommandExecutor { 13 | 14 | @Override 15 | public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { 16 | sender.sendMessage("あなたは「/hoge piyo」コマンドを実行しました!!"); 17 | return true; 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /Part0-9/Part5/src/main/resources/plugin.yml: -------------------------------------------------------------------------------- 1 | main: jp.jyn.part5.Main 2 | name: "${project.artifactId}" 3 | version: "${project.version}" 4 | website: "https://jyn.jp/bukkit-plugin-development-5/" 5 | author: "@HimaJyun" 6 | 7 | commands: 8 | hoge: 9 | description: '"/hoge fuga" or "/hoge piyo"' -------------------------------------------------------------------------------- /Part0-9/Part6/README.md: -------------------------------------------------------------------------------- 1 | # 其之六-特定の出来事(イベント)に反応する 2 | 其之六、特定のイベントが発火するたびに処理を行うコード 3 | 記事は[[Bukkitプラグイン制作講座-其之六]特定の出来事(イベント)に反応する](https://jyn.jp/bukkit-plugin-development-6/)でご覧いただける 4 | -------------------------------------------------------------------------------- /Part0-9/Part6/pom.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | UTF-8 5 | 1.7 6 | 7 | 4.0.0 8 | jp.jyn 9 | Part6 10 | 0.0.1-SNAPSHOT 11 | 12 | 13 | 14 | org.apache.maven.plugins 15 | maven-compiler-plugin 16 | 3.5.1 17 | 18 | ${java.version} 19 | ${java.version} 20 | 21 | 22 | 23 | 24 | 25 | . 26 | true 27 | src/main/resources/ 28 | 29 | 30 | 31 | 32 | 33 | spigot-repo 34 | https://hub.spigotmc.org/nexus/content/groups/public/ 35 | 36 | 37 | 38 | 39 | org.spigotmc 40 | spigot-api 41 | 1.10.2-R0.1-SNAPSHOT 42 | 43 | 44 | -------------------------------------------------------------------------------- /Part0-9/Part6/src/main/java/jp/jyn/part6/BlockPlace.java: -------------------------------------------------------------------------------- 1 | package jp.jyn.part6; 2 | 3 | import org.bukkit.block.Block; 4 | import org.bukkit.entity.Player; 5 | import org.bukkit.event.EventHandler; 6 | import org.bukkit.event.EventPriority; 7 | import org.bukkit.event.HandlerList; 8 | import org.bukkit.event.Listener; 9 | import org.bukkit.event.block.BlockPlaceEvent; 10 | import org.bukkit.plugin.Plugin; 11 | 12 | public class BlockPlace implements Listener { 13 | 14 | public BlockPlace(Plugin plugin) { 15 | // ここで登録している 16 | plugin.getServer().getPluginManager().registerEvents(this, plugin); 17 | } 18 | 19 | @EventHandler(priority = EventPriority.HIGHEST) 20 | public void 関数名は何でも良い(BlockPlaceEvent e) { 21 | Player player = e.getPlayer(); // ブロックを置いたプレイヤーを取得する 22 | Block block = e.getBlock(); // 設置したブロックを取得 23 | 24 | // メッセージを組み立て 25 | StringBuilder builder = new StringBuilder("BlockPlaceEventが発生:"); 26 | builder.append("設置した物=").append(block.toString()).append(" "); 27 | 28 | // プレイヤーにメッセージを送信 29 | player.sendMessage(builder.toString()); 30 | } 31 | 32 | /** 33 | * イベントの登録を解除します 34 | */ 35 | public void unregister() { 36 | // 以下の様に、イベントクラス側から解除する事も可能 37 | BlockPlaceEvent.getHandlerList().unregister(this); 38 | HandlerList.unregisterAll(this); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /Part0-9/Part6/src/main/java/jp/jyn/part6/Main.java: -------------------------------------------------------------------------------- 1 | package jp.jyn.part6; 2 | 3 | import org.bukkit.event.HandlerList; 4 | import org.bukkit.plugin.java.JavaPlugin; 5 | 6 | public class Main extends JavaPlugin { 7 | 8 | @Override 9 | public void onEnable() { 10 | // 他のクラスから登録する場合 11 | //getServer().getPluginManager().registerEvents(new BlockPlace(), this); 12 | 13 | // コンストラクタで登録する場合 14 | new BlockPlace(this); 15 | } 16 | 17 | @Override 18 | public void onDisable() { 19 | // 特定のイベントだけを解除する場合 20 | //BlockPlaceEvent.getHandlerList().unregister(this); 21 | // 全てのイベントを解除する場合 22 | HandlerList.unregisterAll(this); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /Part0-9/Part6/src/main/resources/plugin.yml: -------------------------------------------------------------------------------- 1 | main: jp.jyn.part6.Main 2 | name: "${project.artifactId}" 3 | version: "${project.version}" 4 | website: "https://jyn.jp/bukkit-plugin-development-6/" 5 | author: "@HimaJyun" -------------------------------------------------------------------------------- /Part0-9/Part7/README.md: -------------------------------------------------------------------------------- 1 | # 其之七-config.ymlを扱う 2 | 其之七、config.yml(yamlの設定ファイル)を扱う方法 3 | 記事は[[Bukkitプラグイン制作講座-其之七]config.ymlを扱う](https://jyn.jp/bukkit-plugin-development-7/)でご覧いただける 4 | -------------------------------------------------------------------------------- /Part0-9/Part7/pom.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | UTF-8 5 | 1.7 6 | 7 | 4.0.0 8 | jp.jyn 9 | Part7 10 | 0.0.1-SNAPSHOT 11 | 12 | 13 | 14 | org.apache.maven.plugins 15 | maven-compiler-plugin 16 | 3.5.1 17 | 18 | ${java.version} 19 | ${java.version} 20 | 21 | 22 | 23 | 24 | 25 | . 26 | true 27 | src/main/resources/ 28 | 29 | 30 | 31 | 32 | 33 | spigot-repo 34 | https://hub.spigotmc.org/nexus/content/groups/public/ 35 | 36 | 37 | 38 | 39 | org.spigotmc 40 | spigot-api 41 | 1.10.2-R0.1-SNAPSHOT 42 | 43 | 44 | -------------------------------------------------------------------------------- /Part0-9/Part7/src/main/java/jp/jyn/part7/Config.java: -------------------------------------------------------------------------------- 1 | package jp.jyn.part7; 2 | 3 | import java.util.HashMap; 4 | import java.util.Map; 5 | 6 | import org.bukkit.configuration.file.FileConfiguration; 7 | import org.bukkit.plugin.Plugin; 8 | 9 | /** 10 | * 設定をまとめて取り扱う構造体 11 | * @author HimaJyun 12 | * 13 | */ 14 | public class Config { 15 | 16 | private final Plugin plugin; 17 | private FileConfiguration config = null; 18 | 19 | private String message; 20 | private String message2Message3; 21 | private int value1; 22 | private double value2; 23 | 24 | private Map mapKeys = new HashMap<>(); 25 | 26 | public Config(Plugin plugin) { 27 | this.plugin = plugin; 28 | // ロードする 29 | load(); 30 | } 31 | 32 | /** 33 | * 設定をロードします 34 | */ 35 | public void load() { 36 | // 設定ファイルを保存 37 | plugin.saveDefaultConfig(); 38 | if (config != null) { // configが非null == リロードで呼び出された 39 | plugin.reloadConfig(); 40 | } 41 | config = plugin.getConfig(); 42 | 43 | if (!config.contains("Message")) { // 存在チェック 44 | plugin.getLogger().info("config.ymlがなんか変です!!"); 45 | } else if (!config.isString("Message")) { 46 | plugin.getLogger().info("config.ymlのMessageがStringじゃないです!!"); 47 | } 48 | 49 | message = config.getString("Message", "デフォルト値"); 50 | message2Message3 = config.getString("Message2.Message3"); 51 | 52 | value1 = config.getInt("Value1"); 53 | value2 = config.getDouble("Value2"); 54 | 55 | for (String key : config.getConfigurationSection("MapKeys").getKeys(false)) { 56 | mapKeys.put(key, config.getString("MapKeys." + key)); 57 | } 58 | 59 | config.options().header("Comment1\nComment2"); 60 | } 61 | 62 | public String getMessage() { 63 | return message; 64 | } 65 | 66 | public boolean setMessage(String message) { 67 | // 例えばnullチェックをしたり 68 | if (message == null) { 69 | return false; 70 | } 71 | 72 | // 値をセットした後に自動で保存したり 73 | this.message = message; 74 | config.set("Message", message); 75 | plugin.saveConfig(); 76 | 77 | return true; 78 | } 79 | 80 | public String getMessage2Message3() { 81 | return message2Message3; 82 | } 83 | 84 | public int getValue1() { 85 | return value1; 86 | } 87 | 88 | public double getValue2() { 89 | return value2; 90 | } 91 | 92 | public Map getMapKeys() { 93 | return mapKeys; 94 | } 95 | 96 | } 97 | -------------------------------------------------------------------------------- /Part0-9/Part7/src/main/java/jp/jyn/part7/Main.java: -------------------------------------------------------------------------------- 1 | package jp.jyn.part7; 2 | 3 | import java.util.Map.Entry; 4 | 5 | import org.bukkit.plugin.java.JavaPlugin; 6 | 7 | public class Main extends JavaPlugin { 8 | 9 | private Config config; 10 | 11 | @Override 12 | public void onEnable() { 13 | config = new Config(this); 14 | 15 | i("Message: " + config.getMessage()); 16 | i("Message2.Message3: " + config.getMessage2Message3()); 17 | i("Value1: " + config.getValue1()); 18 | i("Value2: " + config.getValue2()); 19 | 20 | for (Entry a : config.getMapKeys().entrySet()) { 21 | i("MapKeys." + a.getKey() + ": " + a.getValue()); 22 | } 23 | 24 | config.setMessage("aaa"); 25 | 26 | i("Message: " + config.getMessage()); 27 | 28 | } 29 | 30 | /** 31 | * 単なるロガーのラッパー 32 | * @param msg 33 | */ 34 | private void i(String msg) { 35 | getLogger().info(msg); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /Part0-9/Part7/src/main/resources/config.yml: -------------------------------------------------------------------------------- 1 | Message: "string" 2 | Message2: 3 | Message3: "string2" 4 | 5 | Value1: 1 6 | Value2: 1.1 7 | 8 | MapKeys: 9 | Key1: "A" 10 | Key2: "B" 11 | Key3: "C" -------------------------------------------------------------------------------- /Part0-9/Part7/src/main/resources/plugin.yml: -------------------------------------------------------------------------------- 1 | main: jp.jyn.part7.Main 2 | name: "${project.artifactId}" 3 | version: "${project.version}" 4 | website: "https://jyn.jp/bukkit-plugin-development-7/" 5 | author: "@HimaJyun" -------------------------------------------------------------------------------- /Part0-9/Part8/README.md: -------------------------------------------------------------------------------- 1 | # 其之八-複数のymlファイルを扱う 2 | 其之八、複数のymlファイルを扱う方法 3 | 記事は[[Bukkitプラグイン制作講座-其之八]複数のymlファイルを扱う](https://jyn.jp/bukkit-plugin-development-8/)でご覧いただける 4 | -------------------------------------------------------------------------------- /Part0-9/Part8/pom.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | UTF-8 5 | 1.7 6 | 7 | 4.0.0 8 | jp.jyn 9 | Part8 10 | 0.0.1-SNAPSHOT 11 | 12 | 13 | 14 | org.apache.maven.plugins 15 | maven-compiler-plugin 16 | 3.5.1 17 | 18 | ${java.version} 19 | ${java.version} 20 | 21 | 22 | 23 | 24 | 25 | . 26 | true 27 | src/main/resources/ 28 | 29 | 30 | 31 | 32 | 33 | spigot-repo 34 | https://hub.spigotmc.org/nexus/content/groups/public/ 35 | 36 | 37 | 38 | 39 | org.spigotmc 40 | spigot-api 41 | 1.10.2-R0.1-SNAPSHOT 42 | 43 | 44 | -------------------------------------------------------------------------------- /Part0-9/Part8/src/main/java/jp/jyn/part8/CustomConfig.java: -------------------------------------------------------------------------------- 1 | package jp.jyn.part8; 2 | 3 | import java.io.File; 4 | import java.io.IOException; 5 | import java.io.InputStream; 6 | import java.io.InputStreamReader; 7 | import java.nio.charset.StandardCharsets; 8 | import java.util.logging.Level; 9 | 10 | import org.bukkit.configuration.file.FileConfiguration; 11 | import org.bukkit.configuration.file.YamlConfiguration; 12 | import org.bukkit.plugin.Plugin; 13 | 14 | /** 15 | * config.yml以外の設定ファイルも扱えるクラス 16 | * @author HimaJyun 17 | * 18 | */ 19 | public class CustomConfig { 20 | 21 | /*    ____ 22 | *   r勺z勺z勺ュ\ 23 | *  〈/⌒⌒⌒\乙 ヽ 24 | *  //  | | ヽ〉| 25 | * /| /レ| N∧ |\| 26 | * 7 レイ=ュヽ|r=ヽ|_> 27 | * `レ|ハ|Oソ  ヒOソV|N <オジョウサマー 28 | *  (人゙ `_ ゙(ソ从 29 | *  (ソレ>――<(ソノ 30 | *  (ソ| レ|/L/ (ソ 31 | * [>ヘL/ 只 L[>O<] 32 | * (⌒O|んz>/ /⌒} 33 | * ⊂ニ⊃L  / ∩< 34 | * / /\/\[(⌒)|二フ 35 | * )ノ /    ̄∪タ\ 36 | *   /ヒ辷辷辷辷タ  > 37 | *   \_____/ 38 | *    | / | / 39 | */ 40 | 41 | private FileConfiguration config = null; 42 | private final File configFile; 43 | private final String file; 44 | private final Plugin plugin; 45 | 46 | /** 47 | * config.ymlを設定として読み書きするカスタムコンフィグクラスをインスタンス化します。 48 | * 49 | * @param plugin 50 | * ロード対象のプラグイン 51 | */ 52 | public CustomConfig(Plugin plugin) { 53 | this(plugin, "config.yml"); 54 | } 55 | 56 | /** 57 | * 指定したファイル名で設定を読み書きするカスタムコンフィグクラスをインスタンス化します。 58 | * 59 | * @param plugin 60 | * ロード対象のプラグイン 61 | * @param fileName 62 | * 読み込みファイル名 63 | */ 64 | public CustomConfig(Plugin plugin, String fileName) { 65 | this.plugin = plugin; 66 | this.file = fileName; 67 | configFile = new File(plugin.getDataFolder(), file); 68 | } 69 | 70 | /** 71 | * デフォルト設定を保存します。 72 | */ 73 | public void saveDefaultConfig() { 74 | if (!configFile.exists()) { 75 | plugin.saveResource(file, false); 76 | } 77 | } 78 | 79 | /** 80 | * 読み込んだFileConfiguretionを提供します。 81 | * 82 | * @return 読み込んだ設定 83 | */ 84 | public FileConfiguration getConfig() { 85 | if (config == null) { 86 | reloadConfig(); 87 | } 88 | return config; 89 | } 90 | 91 | /** 92 | * 設定を保存します。 93 | */ 94 | public void saveConfig() { 95 | if (config == null) { 96 | return; 97 | } 98 | try { 99 | getConfig().save(configFile); 100 | } catch (IOException ex) { 101 | plugin.getLogger().log(Level.SEVERE, "Could not save config to " + configFile, ex); 102 | } 103 | } 104 | 105 | /** 106 | * 設定をリロードします。 107 | */ 108 | public void reloadConfig() { 109 | config = YamlConfiguration.loadConfiguration(configFile); 110 | 111 | final InputStream defConfigStream = plugin.getResource(file); 112 | if (defConfigStream == null) { 113 | return; 114 | } 115 | 116 | config.setDefaults( 117 | YamlConfiguration.loadConfiguration(new InputStreamReader(defConfigStream, StandardCharsets.UTF_8))); 118 | } 119 | } 120 | -------------------------------------------------------------------------------- /Part0-9/Part8/src/main/java/jp/jyn/part8/Main.java: -------------------------------------------------------------------------------- 1 | package jp.jyn.part8; 2 | 3 | import org.bukkit.plugin.java.JavaPlugin; 4 | 5 | public class Main extends JavaPlugin { 6 | 7 | /** 8 | * config.yml 9 | */ 10 | CustomConfig config; 11 | /** 12 | * message.yml 13 | */ 14 | CustomConfig message; 15 | 16 | @Override 17 | public void onEnable() { 18 | config = new CustomConfig(this); 19 | message = new CustomConfig(this, "message.yml"); 20 | 21 | // TODO:ここで設定ファイルを利用してゴニョゴニョする。 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Part0-9/Part8/src/main/resources/config.yml: -------------------------------------------------------------------------------- 1 | config: "aaa" -------------------------------------------------------------------------------- /Part0-9/Part8/src/main/resources/message.yml: -------------------------------------------------------------------------------- 1 | message: "iii" -------------------------------------------------------------------------------- /Part0-9/Part8/src/main/resources/plugin.yml: -------------------------------------------------------------------------------- 1 | main: jp.jyn.part8.Main 2 | name: "${project.artifactId}" 3 | version: "${project.version}" 4 | website: "https://jyn.jp/bukkit-plugin-development-8/" 5 | author: "@HimaJyun" -------------------------------------------------------------------------------- /Part0-9/Part9/README.md: -------------------------------------------------------------------------------- 1 | # 其之九-チェストの中身(インベントリ)を操作する 2 | 其之九、インベントリの扱い方 3 | 記事は[[Bukkitプラグイン制作講座-其之九]チェストの中身(インベントリ)を操作する](https://jyn.jp/bukkit-plugin-development-9/)でご覧いただける 4 | -------------------------------------------------------------------------------- /Part0-9/Part9/pom.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | UTF-8 5 | 1.7 6 | 7 | 4.0.0 8 | jp.jyn 9 | Part9 10 | 0.0.1-SNAPSHOT 11 | 12 | 13 | 14 | org.apache.maven.plugins 15 | maven-compiler-plugin 16 | 3.5.1 17 | 18 | ${java.version} 19 | ${java.version} 20 | 21 | 22 | 23 | 24 | 25 | . 26 | true 27 | src/main/resources/ 28 | 29 | 30 | 31 | 32 | 33 | spigot-repo 34 | https://hub.spigotmc.org/nexus/content/groups/public/ 35 | 36 | 37 | 38 | 39 | org.spigotmc 40 | spigot-api 41 | 1.11-R0.1-SNAPSHOT 42 | 43 | 44 | -------------------------------------------------------------------------------- /Part0-9/Part9/src/main/java/jp/jyn/part9/Main.java: -------------------------------------------------------------------------------- 1 | package jp.jyn.part9; 2 | 3 | import java.util.HashMap; 4 | import java.util.Map.Entry; 5 | 6 | import org.bukkit.Location; 7 | import org.bukkit.Material; 8 | import org.bukkit.Particle; 9 | import org.bukkit.Sound; 10 | import org.bukkit.World; 11 | import org.bukkit.block.Block; 12 | import org.bukkit.block.BlockFace; 13 | import org.bukkit.block.Chest; 14 | import org.bukkit.block.ShulkerBox; 15 | import org.bukkit.event.EventHandler; 16 | import org.bukkit.event.Listener; 17 | import org.bukkit.event.block.BlockDamageEvent; 18 | import org.bukkit.inventory.Inventory; 19 | import org.bukkit.inventory.ItemStack; 20 | import org.bukkit.plugin.java.JavaPlugin; 21 | 22 | public class Main extends JavaPlugin implements Listener { 23 | 24 | @EventHandler(ignoreCancelled = true) 25 | public void BlockDamage(BlockDamageEvent e) { // 殴った時に作動する 26 | Block block = e.getBlock(); // 殴られたブロックを取得 27 | 28 | if (block.getType() != Material.CHEST) { // チェスト以外 29 | return; // 何もしない 30 | // TODO:トラップチェストにも対応したいなら変更が必要ね。 31 | } else if (isLargeChest(block)) { // ラージチェストなら何もしない 32 | return; 33 | } 34 | /* こんな感じでも書ける 35 | * if(block.getType() != Material.CHEST && isLargeChest(block)) 36 | */ 37 | 38 | // Chestにキャスト 39 | Chest chest = (Chest) block.getState(); 40 | // チェストのインベントリを取得 41 | Inventory oldInv = chest.getInventory(); 42 | 43 | // 中身を取り出しておく 44 | HashMap items = new HashMap<>(); 45 | // 中身を移す 46 | for (int i = 0, size = oldInv.getSize(); i < size; ++i) { 47 | // アイテム取得 48 | ItemStack item = oldInv.getItem(i); 49 | if (item == null) { // アイテムがnull(ない)なら次へ 50 | continue; 51 | } 52 | 53 | // 追加 54 | items.put(i, item); 55 | } 56 | // 古い方の中身を消してアイテムが飛び出さない(増加しない)様にする 57 | oldInv.clear(); 58 | 59 | // シュルカーボックスに変えちゃう(ちなみにこの時中にアイテムが入っていると飛び出すみたい) 60 | block.setType(Material.PURPLE_SHULKER_BOX); 61 | // シュルカーボックスにキャスト 62 | ShulkerBox box = (ShulkerBox) block.getState(); 63 | // シュルカーボックスのインベントリ 64 | Inventory newInv = box.getInventory(); 65 | 66 | // 予め取り出しておいた中身を入れる 67 | for (Entry item : items.entrySet()) { 68 | // アイテムを入れる 69 | newInv.setItem(item.getKey(), item.getValue()); 70 | } 71 | 72 | // ついでに適当にエフェクトでも出しとくか 73 | Location boxLoc = block.getLocation().clone(); 74 | World world = boxLoc.getWorld(); 75 | // 1ブロック上げとく(そっちの方が見やすい) 76 | boxLoc.setY(boxLoc.getY() + 1); 77 | // ダメージの無い爆発 78 | world.createExplosion(boxLoc, 0); 79 | // ダメージのない落雷 80 | world.strikeLightningEffect(boxLoc); 81 | // パーティクル 82 | world.spawnParticle(Particle.VILLAGER_HAPPY, boxLoc, 20, 1, 1, 1); 83 | // 音 84 | world.playSound(boxLoc, Sound.ENTITY_PLAYER_LEVELUP, 1, 1); 85 | } 86 | 87 | /** 88 | * ラージチェストかどうかをチェック(他に良い方法知ってたら教えて) 89 | * @param chest 対象のブロック 90 | * @return ラージチェストならtrue、違えばfalse 91 | */ 92 | private boolean isLargeChest(Block block) { 93 | if (block.getType() != Material.CHEST) { // そもそもチェストじゃない 94 | return false; 95 | } 96 | 97 | // 東西南北でテスト 98 | for (BlockFace face : new BlockFace[] { 99 | BlockFace.NORTH, 100 | BlockFace.SOUTH, 101 | BlockFace.EAST, 102 | BlockFace.WEST, 103 | }) { 104 | // その位置にあるブロックを取得 105 | Block relative = block.getRelative(face); 106 | if (relative.getType() == Material.CHEST) { // それが2個横並び(ラージチェスト)なら 107 | // true 108 | return true; 109 | } 110 | } 111 | 112 | // ラージチェストじゃない 113 | return false; 114 | } 115 | 116 | @Override 117 | public void onEnable() { 118 | getServer().getPluginManager().registerEvents(this, this); 119 | } 120 | 121 | // どうでも良いけど、今回は説明用でこうしてるだけで 122 | // やたらめったらコメント書きまくると却って読みづらいよ。 123 | // コードから読み取れる事はコメントに書くな、読み取れない所だけ書けって誰かが…… 124 | } 125 | -------------------------------------------------------------------------------- /Part0-9/Part9/src/main/resources/plugin.yml: -------------------------------------------------------------------------------- 1 | main: jp.jyn.part9.Main 2 | name: "${project.artifactId}" 3 | version: "${project.version}" 4 | website: "https://jyn.jp/bukkit-plugin-development-9/" 5 | author: "@HimaJyun" -------------------------------------------------------------------------------- /Part10-19/Part10/README.md: -------------------------------------------------------------------------------- 1 | # 其之十-各種視聴覚効果 2 | 其之十、視聴覚系の効果 3 | 記事は[[Bukkitプラグイン制作講座-其之十]音を鳴らす、爆発を起こす](https://jyn.jp/bukkit-plugin-development-10/)でご覧いただける 4 | -------------------------------------------------------------------------------- /Part10-19/Part10/pom.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | UTF-8 5 | 1.7 6 | 7 | 4.0.0 8 | jp.jyn 9 | Part10 10 | 0.0.1-SNAPSHOT 11 | 12 | 13 | 14 | org.apache.maven.plugins 15 | maven-compiler-plugin 16 | 3.5.1 17 | 18 | ${java.version} 19 | ${java.version} 20 | 21 | 22 | 23 | 24 | 25 | . 26 | true 27 | src/main/resources/ 28 | 29 | 30 | 31 | 32 | 33 | spigot-repo 34 | https://hub.spigotmc.org/nexus/content/groups/public/ 35 | 36 | 37 | 38 | 39 | org.spigotmc 40 | spigot-api 41 | 1.11-R0.1-SNAPSHOT 42 | 43 | 44 | -------------------------------------------------------------------------------- /Part10-19/Part10/src/main/java/jp/jyn/part10/Main.java: -------------------------------------------------------------------------------- 1 | package jp.jyn.part10; 2 | 3 | import org.bukkit.Effect; 4 | import org.bukkit.Location; 5 | import org.bukkit.Particle; 6 | import org.bukkit.Sound; 7 | import org.bukkit.command.Command; 8 | import org.bukkit.command.CommandSender; 9 | import org.bukkit.entity.Player; 10 | import org.bukkit.plugin.java.JavaPlugin; 11 | 12 | public class Main extends JavaPlugin { 13 | 14 | @Override 15 | public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { 16 | if (!(sender instanceof Player)) { // コンソールからは動かないようにしておく 17 | return true; 18 | } 19 | Location loc = ((Player) sender).getLocation(); 20 | sound(loc); 21 | //explosion(loc); 22 | //particle(loc); 23 | effect(loc); 24 | //lightning(loc); 25 | 26 | return true; 27 | } 28 | 29 | /** 30 | * 音を鳴らすサンプル 31 | * @param loc 32 | */ 33 | private void sound(Location loc) { 34 | loc.getWorld().playSound( 35 | loc, // 鳴らす場所 36 | Sound.ENTITY_PLAYER_LEVELUP, // 鳴らす音 37 | 100, // 音量 38 | 3f // 音程 39 | ); 40 | } 41 | 42 | /** 43 | * 爆発を起こすサンプル 44 | * @param loc 45 | */ 46 | @SuppressWarnings("unused") 47 | private void explosion(Location loc) { 48 | //loc.getWorld().createExplosion(loc, 500); 49 | //loc.getWorld().createExplosion(loc, 300, true); 50 | //loc.getWorld().createExplosion(0, 60, 0, 50); 51 | //loc.getWorld().createExplosion(0, 60, 0, 30, true); 52 | loc.getWorld().createExplosion( 53 | loc.getX(), 54 | loc.getY(), 55 | loc.getZ(), 56 | 100, 57 | true, // 火をつける 58 | false // でもブロックは壊さない 59 | ); 60 | } 61 | 62 | /** 63 | * パーティクルを発生させる 64 | * @param loc 65 | */ 66 | @SuppressWarnings("unused") 67 | private void particle(Location loc) { 68 | //loc.getWorld().spawnParticle(Particle.VILLAGER_HAPPY, loc,10); 69 | /* 70 | loc.getWorld().spawnParticle( 71 | Particle.VILLAGER_HAPPY, 72 | loc, 73 | 50, 74 | 10, // 散開させるXの範囲 75 | 10, // 散開させるYの範囲 76 | 10 // 散開させるZの範囲 77 | );//*/ 78 | //* 79 | loc.getWorld().spawnParticle( 80 | Particle.CLOUD, 81 | loc, 82 | 500, 83 | 10, // 散開させるXの範囲 84 | 10, // 散開させるYの範囲 85 | 10, // 散開させるZの範囲 86 | 0.1 // 速度? 87 | );//*/ 88 | } 89 | 90 | /** 91 | * エフェクトを発生させる 92 | * @param loc 93 | */ 94 | private void effect(Location loc) { 95 | loc.getWorld().playEffect( 96 | loc, // 発生させる場所 97 | Effect.DRAGON_BREATH, // エフェクトの種類 98 | 0, // 大抵の場合は無意味 99 | 10 // エフェクトの範囲 100 | ); 101 | } 102 | 103 | /** 104 | * 雷を落とす 105 | * @param loc 106 | */ 107 | @SuppressWarnings("unused") 108 | private void lightning(Location loc) { 109 | //loc.getWorld().strikeLightning(loc); 110 | loc.getWorld().strikeLightningEffect(loc); 111 | } 112 | 113 | } 114 | -------------------------------------------------------------------------------- /Part10-19/Part10/src/main/resources/plugin.yml: -------------------------------------------------------------------------------- 1 | main: jp.jyn.part10.Main 2 | name: "${project.artifactId}" 3 | version: "${project.version}" 4 | website: "https://jyn.jp/bukkit-plugin-development-10/" 5 | author: "@HimaJyun" 6 | 7 | commands: 8 | part10: 9 | description: 'for Part10.' -------------------------------------------------------------------------------- /Part10-19/Part11/README.md: -------------------------------------------------------------------------------- 1 | # 其之十一-めたでぇた 2 | 其之十一、メタデータの取り扱い 3 | 記事は[[Bukkitプラグイン制作講座-其之十一]メタデータを扱う](https://jyn.jp/bukkit-plugin-development-11/)でご覧いただける 4 | -------------------------------------------------------------------------------- /Part10-19/Part11/pom.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | UTF-8 5 | 1.7 6 | 7 | 4.0.0 8 | jp.jyn 9 | Part11 10 | 0.0.1-SNAPSHOT 11 | 12 | 13 | 14 | org.apache.maven.plugins 15 | maven-compiler-plugin 16 | 3.5.1 17 | 18 | ${java.version} 19 | ${java.version} 20 | 21 | 22 | 23 | 24 | 25 | . 26 | true 27 | src/main/resources/ 28 | 29 | 30 | 31 | 32 | 33 | spigot-repo 34 | https://hub.spigotmc.org/nexus/content/groups/public/ 35 | 36 | 37 | 38 | 39 | org.spigotmc 40 | spigot-api 41 | 1.11-R0.1-SNAPSHOT 42 | 43 | 44 | -------------------------------------------------------------------------------- /Part10-19/Part11/src/main/java/jp/jyn/part11/Main.java: -------------------------------------------------------------------------------- 1 | package jp.jyn.part11; 2 | 3 | import java.util.List; 4 | 5 | import org.bukkit.Location; 6 | import org.bukkit.entity.Entity; 7 | import org.bukkit.entity.LivingEntity; 8 | import org.bukkit.entity.Player; 9 | import org.bukkit.event.EventHandler; 10 | import org.bukkit.event.Listener; 11 | import org.bukkit.event.entity.CreatureSpawnEvent; 12 | import org.bukkit.event.entity.EntityDeathEvent; 13 | import org.bukkit.metadata.FixedMetadataValue; 14 | import org.bukkit.metadata.MetadataValue; 15 | import org.bukkit.plugin.Plugin; 16 | import org.bukkit.plugin.java.JavaPlugin; 17 | 18 | public class Main extends JavaPlugin implements Listener { 19 | 20 | // TODO:何らかの方法で「Plugin」のインスタンスを渡す必要があります。 21 | // (今回はメインクラスにイベントリスナを書いているのでthisが使えますが、実際はコンストラクタなどで渡す必要あり) 22 | Plugin plugin = this; 23 | 24 | // 識別子的な、こうやって定数化(final+static)しておくと後の変更が楽 25 | private final static String DATA_KEY = "SPAWNLOCATION"; 26 | 27 | @EventHandler(ignoreCancelled = true) 28 | public void spawn(CreatureSpawnEvent e) { 29 | // メタデータを付けたいEntity 30 | Entity entity = e.getEntity(); 31 | entity.setMetadata( 32 | DATA_KEY, // key 33 | new FixedMetadataValue( 34 | plugin, // プラグイン 35 | entity.getLocation().clone() // 設定したい値 36 | )); 37 | } 38 | 39 | @EventHandler(ignoreCancelled = true) 40 | public void kill(EntityDeathEvent e) { 41 | // 殺されたエンティティ 42 | LivingEntity entity = e.getEntity(); 43 | // エンティティを殺したプレイヤー 44 | Player player = entity.getKiller(); 45 | 46 | // null=プレイヤーが殺したのではないなら 47 | if (player == null) { 48 | return; // 何もしない 49 | } 50 | 51 | // メタデータを取得する 52 | List values = entity.getMetadata(DATA_KEY); 53 | MetadataValue value = null; 54 | 55 | // ループで全部チェックする 56 | for (MetadataValue v : values) { 57 | // 名前を比較して同じプラグインか確認 58 | if (v.getOwningPlugin().getName().equals(plugin.getName())) { 59 | // 同じなら値をセットしてループ抜ける 60 | value = v; 61 | break; 62 | } 63 | } 64 | 65 | // nullのまま(見つからなかった) 66 | if (value == null) { 67 | return; // TODO:何か処理 68 | } 69 | 70 | // キャストする 71 | Location location = (Location) value.value(); 72 | 73 | // 出力する 74 | player.sendMessage( 75 | "あなたがたった今、命を奪ったMOBは" 76 | + location.getWorld().getName() 77 | + "の、X=" 78 | + location.getBlockX() 79 | + ",Y=" 80 | + location.getBlockY() 81 | + ",Z=" 82 | + location.getBlockZ() 83 | + "で生まれたMOBです……"); 84 | } 85 | 86 | /** 87 | * 値の削除の例示 88 | * @param entity 値を削除するエンティティ 89 | */ 90 | @SuppressWarnings("unused") 91 | private void remove(Entity entity) { 92 | entity.removeMetadata( 93 | DATA_KEY, // key 94 | plugin // プラグイン 95 | ); 96 | } 97 | 98 | /** 99 | * 値の存在確認の例示 100 | * @param entity 存在確認を行うエンティティ 101 | * @return あればtrue 102 | */ 103 | 104 | @SuppressWarnings("unused") 105 | private boolean has(Entity entity) { 106 | return entity.hasMetadata(DATA_KEY); 107 | } 108 | 109 | /** 110 | * キャストが要らない取得の例示 111 | * @param value 取得する値 112 | */ 113 | @SuppressWarnings("unused") 114 | private void get(MetadataValue value) { 115 | value.asBoolean(); // boolean 116 | value.asByte(); // byte 117 | value.asDouble(); // double 118 | value.asFloat(); // float 119 | value.asInt(); // int 120 | value.asLong(); // long 121 | value.asShort(); // short 122 | value.asString(); // String 123 | } 124 | 125 | @Override 126 | public void onEnable() { 127 | getServer().getPluginManager().registerEvents(this, this); 128 | } 129 | } 130 | -------------------------------------------------------------------------------- /Part10-19/Part11/src/main/resources/plugin.yml: -------------------------------------------------------------------------------- 1 | main: jp.jyn.part11.Main 2 | name: "${project.artifactId}" 3 | version: "${project.version}" 4 | website: "https://jyn.jp/bukkit-plugin-development-11/" 5 | author: "@HimaJyun" -------------------------------------------------------------------------------- /Part10-19/Part12/README.md: -------------------------------------------------------------------------------- 1 | # 其之十二-君、どこ出身? 2 | 其之十二、メタデータを利用してスポナーから沸いたか判定 3 | 記事は[[Bukkitプラグイン制作講座-其之十二]MOBスポナーから湧いた敵か判定する](https://jyn.jp/bukkit-plugin-development-12/)でご覧いただける 4 | -------------------------------------------------------------------------------- /Part10-19/Part12/pom.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | UTF-8 5 | 1.7 6 | 7 | 4.0.0 8 | jp.jyn 9 | Part12 10 | 0.0.1-SNAPSHOT 11 | 12 | 13 | 14 | org.apache.maven.plugins 15 | maven-compiler-plugin 16 | 3.5.1 17 | 18 | ${java.version} 19 | ${java.version} 20 | 21 | 22 | 23 | 24 | 25 | . 26 | true 27 | src/main/resources/ 28 | 29 | 30 | 31 | 32 | 33 | spigot-repo 34 | https://hub.spigotmc.org/nexus/content/groups/public/ 35 | 36 | 37 | 38 | 39 | org.spigotmc 40 | spigot-api 41 | 1.11-R0.1-SNAPSHOT 42 | 43 | 44 | -------------------------------------------------------------------------------- /Part10-19/Part12/src/main/java/jp/jyn/part12/Main.java: -------------------------------------------------------------------------------- 1 | package jp.jyn.part12; 2 | 3 | import java.util.UUID; 4 | 5 | import org.bukkit.entity.Entity; 6 | import org.bukkit.entity.LivingEntity; 7 | import org.bukkit.entity.Player; 8 | import org.bukkit.event.EventHandler; 9 | import org.bukkit.event.Listener; 10 | import org.bukkit.event.entity.EntityDeathEvent; 11 | import org.bukkit.event.entity.SpawnerSpawnEvent; 12 | import org.bukkit.metadata.FixedMetadataValue; 13 | import org.bukkit.plugin.java.JavaPlugin; 14 | 15 | public class Main extends JavaPlugin implements Listener { 16 | 17 | private final static String KEY = UUID.randomUUID().toString(); 18 | // こっちの方がコンパイル時に展開されるので少し早いかもしれない(変数のUUIDは適当にツールで作った) 19 | //private final static String KEY = "50BC7B80-995A-498C-A589-2C79C8CCF80F"; 20 | 21 | @EventHandler(ignoreCancelled = true) 22 | public void spawnerSpawn(SpawnerSpawnEvent e) { 23 | Entity entity = e.getEntity(); 24 | entity.setMetadata( 25 | KEY, // キー 26 | new FixedMetadataValue( 27 | this, // Plugin型 28 | true // 何でも良い 29 | )); 30 | } 31 | 32 | /** 33 | * 指定したエンティティがスポナーから沸いたエンティティか確認する 34 | * @param entity 確認するエンティティ 35 | * @return スポナーから沸いたのであればtrue、そうでなければfalse 36 | */ 37 | public boolean isSpawnerSpawn(Entity entity) { 38 | return entity.hasMetadata(KEY); 39 | } 40 | 41 | // 動作確認用 42 | @EventHandler(ignoreCancelled = true) 43 | public void kill(EntityDeathEvent e) { 44 | // 殺されたエンティティ 45 | LivingEntity entity = e.getEntity(); 46 | // エンティティを殺したプレイヤー 47 | Player player = entity.getKiller(); 48 | 49 | // null=プレイヤーが殺したのではないなら 50 | if (player == null) { 51 | return; // 何もしない 52 | } 53 | 54 | // 出力する 55 | player.sendMessage("このMOBはスポナーから沸いたMOB" + 56 | (isSpawnerSpawn(entity) ? "です。" : "ではありません。")); // <-三項演算子、説明は要らないよね? 57 | } 58 | 59 | @Override 60 | public void onEnable() { 61 | getServer().getPluginManager().registerEvents(this, this); 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /Part10-19/Part12/src/main/resources/plugin.yml: -------------------------------------------------------------------------------- 1 | main: jp.jyn.part12.Main 2 | name: "${project.artifactId}" 3 | version: "${project.version}" 4 | website: "https://jyn.jp/bukkit-plugin-development-12/" 5 | author: "@HimaJyun" -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Bukkitプラグイン制作 2 | Bukkitプラグイン開発の手法やテクニックなど 3 | 詳しい事はブログ内の「[Bukkitプラグイン制作](https://jyn.jp/tag/bukkit-plugin-development/)」タグが付いた記事みて、どうぞ。 4 | --------------------------------------------------------------------------------