【総合】トピック立てるまでもない質問【Bukkit Plugin制作】

Modding・サーバPlugin制作・ツール制作など、開発関連の質問があればこちらにお願い致します。
フォーラムルール
質問関連フォーラムで質問する時は、必ず次のトピックを一読/厳守お願い致します。
viewtopic.php?f=5&t=999
  • (PostNo.285075)

Re: 【総合】トピック立てるまでもない質問【Bukkit Plugin制作】

投稿記事by King(qpwakaba) » 2016年10月08日(土) 09:50

うましゅー さんが書きました:timerを強制終了するコードを書いてみたのですがエラーが表示されて困っています。

startコマンドを行うことでタイマーを作動させ、強制終了などを行う際にはstopコマンドを行うことでストップできるようにしようと思ったのですが、stopコマンドでエラーが出てしまい、どうすればいいのかわからない状況です。
一応startコマンドは正常作動しており、cancelがきちんと行われています。


提示された部分のコードには、直接的にNullPointerExceptionが発生するコードは含まれていません。
Command_gameのインスタンスをコマンド実行の度に生成してしまうせいで、

  1. startコマンドを打つ。この時生成されたインスタンスをAとする。
  2. A.task にBukkitRunnableが代入される。
  3. stopコマンドを打つ。この時生成されたインスタンスをBとする。
  4. B.task.cancel()を実行しようとするが、B.taskはnullであるためNullPointerExceptionが発生する。

ということが起きています。 呼び出し側で保持しておくなどの工夫が必要となりそうです。
以下サイン
調べて見つからないことを質問して、「そのくらい調べろ」と言われたら それは調べが足りないとき。

投稿画面のBBコード挿入ボタン を追加するユーザースクリプト作りました。良かったらどうぞ。
https://greasyfork.org/ja/scripts/18657
最大描画距離を64チャンクまで伸ばすMod作ってます。
viewtopic.php?t=30697
アバター
King(qpwakaba)
ID:8c8f8b81
ダイヤモンド掘り
 
記事: 823
登録日時: 2013年3月26日(火) 10:25

  • (PostNo.285088)

Re: 【総合】トピック立てるまでもない質問【Bukkit Plugin制作】

投稿記事by うましゅー » 2016年10月08日(土) 12:08

King(qpwakaba) さんが書きました:
うましゅー さんが書きました:timerを強制終了するコードを書いてみたのですがエラーが表示されて困っています。

startコマンドを行うことでタイマーを作動させ、強制終了などを行う際にはstopコマンドを行うことでストップできるようにしようと思ったのですが、stopコマンドでエラーが出てしまい、どうすればいいのかわからない状況です。
一応startコマンドは正常作動しており、cancelがきちんと行われています。


提示された部分のコードには、直接的にNullPointerExceptionが発生するコードは含まれていません。
Command_gameのインスタンスをコマンド実行の度に生成してしまうせいで、

  1. startコマンドを打つ。この時生成されたインスタンスをAとする。
  2. A.task にBukkitRunnableが代入される。
  3. stopコマンドを打つ。この時生成されたインスタンスをBとする。
  4. B.task.cancel()を実行しようとするが、B.taskはnullであるためNullPointerExceptionが発生する。

ということが起きています。 呼び出し側で保持しておくなどの工夫が必要となりそうです。

タイマー専用のクラスを作成し、このクラスを呼び出す形でタイマーを起動、stopできるようにしてみた所、カウントダウンがうまくいかず、仮にconfigで15秒と設定した場合、1秒ごとにずっと15秒とmessageがでるようになってしまいました…

Mainクラス
コード: 全て選択
package umasyu.defense;

import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.scoreboard.Scoreboard;



public class Main extends JavaPlugin{
   public static Main main;
   public static Scoreboard sb;
   private ConfigHandler config;
   private BukkitRunnable Timer;

   @Override
   public void onEnable(){
      main = this;
      sb = sbc.updateScoreboard();
      config = new ConfigHandler(this);
      Timer = new Game_timer(this);
      getCommand("def").setExecutor(new Maincommand(this));
      getLogger().info("[Defense]Pluginの起動に成功しました");
   }
   @Override
   public void onDisable() {
      getLogger().info("[Defense]Pluginを停止しました");
   }
   public ConfigHandler getConfigHandler(){
      return config;
   }
   public BukkitRunnable getBukkitRunnable(){
      return Timer;
   }
}

タイマー専用クラス
コード: 全て選択
package umasyu.defense;

import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;

public class Game_timer extends BukkitRunnable {

   private Main main;
   public Game_timer(Main main){
      this.main = main;
   }
   @Override
   public void run() {
      ConfigHandler config = main.getConfigHandler();
      int second = config.time;
       int sec = second;
        Bukkit.broadcastMessage(sec+"秒");
        if(sec == 0){
            for(Player player : Bukkit.getOnlinePlayers()){
               player.setLevel(0);
            }
            Bukkit.broadcastMessage("ストップ");
            cancel();
         }
        sec --;
   }

}

呼び出しクラス
コード: 全て選択
package umasyu.defense;

import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.scheduler.BukkitRunnable;

public class Command_game{
    private Main main;
    private CommandSender s;
    private String[] args;
    public Command_game(Main main,CommandSender s, String[] args){
        this.main = main;
        this.s = s;
        this.args = args;
        run();
    }
   private void run() {
      BukkitRunnable br = main.getBukkitRunnable();
      if(args.length < 1) {
        }else if (args.length == 1) {
         s.sendMessage(ChatColor.GREEN+"[Defense]"+
               ChatColor.DARK_RED+"引数が足りないか間違ています");
                  return;
        }else if(args.length == 2){
            if(!(args[1].equalsIgnoreCase("start")||args[1].equalsIgnoreCase("stop"))){
              s.sendMessage(ChatColor.GREEN+"[Defense]"+
                   ChatColor.DARK_RED+"引数が足りないか間違ています");
                      return;
            }
            if(args[1].equalsIgnoreCase("start")){
               br.runTaskTimer(main, 0, 20);
               return;
            }else if(args[1].equalsIgnoreCase("stop")){
               br.cancel();
               return;
            }
        }

   }
}

また、エラー表示はなく、1秒ごとにmessageが出てくる状況はstopコマンドを入力することできちんと停止したため、タイマーとしての機能は作動してる状態です。
ニコニコ生放送にて生主をしています。
ついでにPluginも作ってます(新米)
アバター
うましゅー
ID:50149204
大工さん
 
記事: 49
登録日時: 2013年3月30日(土) 09:23

  • (PostNo.285089)

Re: 【総合】トピック立てるまでもない質問【Bukkit Plugin制作】

投稿記事by King(qpwakaba) » 2016年10月08日(土) 12:15

うましゅー さんが書きました:タイマー専用のクラスを作成し、このクラスを呼び出す形でタイマーを起動、stopできるようにしてみた所、カウントダウンがうまくいかず、仮にconfigで15秒と設定した場合、1秒ごとにずっと15秒とmessageがでるようになってしまいました…


呼び出される度に secondを取得し直して変数に入れているため毎回同じ数字が出力されているみたいですね。
最初に呼び出す前に外部から秒数をセットして、内部ではデクリメント以外行わないようにしたほうが良いでしょう。
以下サイン
調べて見つからないことを質問して、「そのくらい調べろ」と言われたら それは調べが足りないとき。

投稿画面のBBコード挿入ボタン を追加するユーザースクリプト作りました。良かったらどうぞ。
https://greasyfork.org/ja/scripts/18657
最大描画距離を64チャンクまで伸ばすMod作ってます。
viewtopic.php?t=30697
アバター
King(qpwakaba)
ID:8c8f8b81
ダイヤモンド掘り
 
記事: 823
登録日時: 2013年3月26日(火) 10:25

  • (PostNo.285140)

Re: 【総合】トピック立てるまでもない質問【Bukkit Plugin制作】

投稿記事by prestage » 2016年10月08日(土) 22:30

forgeでいうTickEvent.ClientTickEventのような毎tick呼ばれるEventはBukkitまたはSpigotに実装されていますか?
実装されていない場合タスクを仕様して毎tick呼ばれるようにしたいのですがその場合極端に鯖が重くなるという事はあるのでしょうか
prestage
ID:023ab4e0
 

  • (PostNo.285145)

Re: 【総合】トピック立てるまでもない質問【Bukkit Plugin制作】

投稿記事by Mon_chi » 2016年10月08日(土) 22:40

prestage さんが書きました:forgeでいうTickEvent.ClientTickEventのような毎tick呼ばれるEventはBukkitまたはSpigotに実装されていますか?
実装されていない場合タスクを仕様して毎tick呼ばれるようにしたいのですがその場合極端に鯖が重くなるという事はあるのでしょうか

毎tick呼ばれるイベントは実装されていません。
サーバーへの負荷は、行う処理によって大きく変わるので何とも言えませんが、スケジューラを使用するだけでは大きな負荷はかかりません。
Mon_chi
ID:2dc4d025
鉄鉱掘り
 
記事: 279
登録日時: 2014年11月20日(木) 19:58

  • (PostNo.285151)

Re: 【総合】トピック立てるまでもない質問【Bukkit Plugin制作】

投稿記事by prestage » 2016年10月08日(土) 22:53

ありがとうございます 大きな負荷は掛からないとの事なので素直にスケジューラーを使う事にします
prestage
ID:023ab4e0
 

  • (PostNo.285406)

Re: 【総合】トピック立てるまでもない質問【Bukkit Plugin制作】

投稿記事by うましゅー » 2016年10月11日(火) 09:19

King(qpwakaba) さんが書きました:
うましゅー さんが書きました:タイマー専用のクラスを作成し、このクラスを呼び出す形でタイマーを起動、stopできるようにしてみた所、カウントダウンがうまくいかず、仮にconfigで15秒と設定した場合、1秒ごとにずっと15秒とmessageがでるようになってしまいました…


呼び出される度に secondを取得し直して変数に入れているため毎回同じ数字が出力されているみたいですね。
最初に呼び出す前に外部から秒数をセットして、内部ではデクリメント以外行わないようにしたほうが良いでしょう。


無事動作しました。ありがとうございます。
ニコニコ生放送にて生主をしています。
ついでにPluginも作ってます(新米)
アバター
うましゅー
ID:dc1fc44d
大工さん
 
記事: 49
登録日時: 2013年3月30日(土) 09:23

  • (PostNo.285451)

Re: 【総合】トピック立てるまでもない質問【Bukkit Plugin制作】

投稿記事by Cartプラグイン作成中 » 2016年10月12日(水) 00:55

現在、Cartプラグインを作成しているのですが。
そこで、1つどうしてもやりたいことがあるのですがどうすればいいのか全くわかりません。
その、やりたいことと言いますのが「レールの上に立っているプレイヤーにぶつかってもMinecartは止まらない」というものです。どうすれば実装が可能なのか、わかりませんので分かる方教えていただけると幸いです。
Cartプラグイン作成中
ID:2a074b2b
 

  • (PostNo.285466)

Re: 【総合】トピック立てるまでもない質問【Bukkit Plugin制作】

投稿記事by Lemon18 » 2016年10月12日(水) 09:10

Cartプラグイン作成中 さんが書きました:現在、Cartプラグインを作成しているのですが。
そこで、1つどうしてもやりたいことがあるのですがどうすればいいのか全くわかりません。
その、やりたいことと言いますのが「レールの上に立っているプレイヤーにぶつかってもMinecartは止まらない」というものです。


調べてみますと、「VehicleEntityCollisionEvent」というのがあるみたいです。
使えるかどうかはわかりませんが、参考程度に。
( setCollisionCancelled(boolean cancel) を使えばできるのかな?)

https://hub.spigotmc.org/javadocs/spigot/org/bukkit/event/vehicle/VehicleEntityCollisionEvent.html
:D
Lemon18
ID:b66be5f3
石掘り
 
記事: 85
登録日時: 2015年6月05日(金) 22:42

  • (PostNo.286916)

Re: 【総合】トピック立てるまでもない質問【Bukkit Plugin制作】

投稿記事by オリゼリ » 2016年11月03日(木) 01:39

Configで指定した座標にあるブロックを指定したアイテムで右クリックしたら作動するプラグインを作っているのですが、
クリックしたときのブロックの座標を指定するやり方が分かりません。
どなたか教えていただけないでしょうか?
質問の仕方とか直したほうがいいよってことがあったら教えていただければ嬉しいです
オリゼリ
ID:2f889857
大工さん
 
記事: 45
登録日時: 2015年4月29日(水) 20:13

  • (PostNo.286924)

Re: 【総合】トピック立てるまでもない質問【Bukkit Plugin制作】

投稿記事by Lemon18 » 2016年11月03日(木) 09:28

オリゼリ さんが書きました:Configで指定した座標にあるブロックを指定したアイテムで右クリックしたら作動するプラグインを作っているのですが、
クリックしたときのブロックの座標を指定するやり方が分かりません。


PlayerInteractEventにはgetClickedBlock()があるので、そこからブロックを取得し、
Block#getLocation()で座標を取得し、コンフィグにsetすればできるかと。
:D
Lemon18
ID:b66be5f3
石掘り
 
記事: 85
登録日時: 2015年6月05日(金) 22:42

  • (PostNo.287025)

Re: 【総合】トピック立てるまでもない質問【Bukkit Plugin制作】

投稿記事by Suzu_A » 2016年11月04日(金) 19:16

失礼します。
現在、一定時間飛行出来るコマンドをプラグインで作成しているのですがコマンド入力後飛行可能モードになった何Tick後、
あるいは何秒後にfly終了させることは可能でしょうか。
タイマー関連無知で行き詰まっています。
Suzu_A
ID:90a8c25c
 

  • (PostNo.287074)

Re: 【総合】トピック立てるまでもない質問【Bukkit Plugin制作】

投稿記事by Hinyari_Gohan » 2016年11月05日(土) 14:00

Suzu_A さんが書きました:失礼します。
現在、一定時間飛行出来るコマンドをプラグインで作成しているのですがコマンド入力後飛行可能モードになった何Tick後、
あるいは何秒後にfly終了させることは可能でしょうか。
タイマー関連無知で行き詰まっています。


http://minecraftjp.info/modding/index.php/%E3%82%B9%E3%82%B1%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%A9%E3%81%AE%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0

こちらのページが参考になるかと。
Hinyari_Gohanで主に活動しております。
見かけた際はどうぞよろしく。
アバター
Hinyari_Gohan
ID:9aad37c5
石掘り
 
記事: 92
登録日時: 2014年4月19日(土) 09:00

  • (PostNo.287169)

Re: 【総合】トピック立てるまでもない質問【Bukkit Plugin制作】

投稿記事by Suzu_A » 2016年11月06日(日) 14:33

返信ありがとうございます。
無事、理想のプラグインを作成出来ました。
Suzu_A
ID:90a8c25c
 

  • (PostNo.287413)

Re: 【総合】トピック立てるまでもない質問【Bukkit Plugin制作】

投稿記事by mmmair » 2016年11月09日(水) 21:46

質問です。
プラグインでバイオーム問わず天候を雨でなく雪にすることは出来ないでしょうか。
mmmair
ID:90a8c25c
 

  • (PostNo.287422)

Re: 【総合】トピック立てるまでもない質問【Bukkit Plugin制作】

投稿記事by King(qpwakaba) » 2016年11月09日(水) 23:10

mmmair さんが書きました:質問です。
プラグインでバイオーム問わず天候を雨でなく雪にすることは出来ないでしょうか。


自分が知る限りだと不可能です。 クライアント側では、雨も雪も状態としては同じで バイオームによってその部分が変化しているため、バイオームを問わず と言うのは仕様上不可能です。

ただし、自身でパーティクルを生成してやれば それっぽい動作は可能です。 非現実的なほど重くなるかもしれませんが。
以下サイン
調べて見つからないことを質問して、「そのくらい調べろ」と言われたら それは調べが足りないとき。

投稿画面のBBコード挿入ボタン を追加するユーザースクリプト作りました。良かったらどうぞ。
https://greasyfork.org/ja/scripts/18657
最大描画距離を64チャンクまで伸ばすMod作ってます。
viewtopic.php?t=30697
アバター
King(qpwakaba)
ID:63fb15bf
ダイヤモンド掘り
 
記事: 823
登録日時: 2013年3月26日(火) 10:25

  • (PostNo.287445)

Re: 【総合】トピック立てるまでもない質問【Bukkit Plugin制作】

投稿記事by farnoie » 2016年11月10日(木) 14:21

アイテムに属性を付与する方法を教えて下さい。
属性とは、例えば体力増加とか移動速度上昇とかです。
バニラのコマンドで出せる物なので、bukkitでもできると思っていたのですが、アイテムにつける方法は調べても見つかりません。
よろしくお願いします。
farnoie
ID:a93637d0
水から上がったとこ
 
記事: 3
登録日時: 2015年10月27日(火) 21:42

  • (PostNo.287449)

Re: 【総合】トピック立てるまでもない質問【Bukkit Plugin制作】

投稿記事by mmmair » 2016年11月10日(木) 15:40

なるほど..そうでしたか..
お早い回答ありがとうございました。
mmmair
ID:90a8c25c
 

  • (PostNo.287528)

Re: 【総合】トピック立てるまでもない質問【Bukkit Plugin制作】

投稿記事by lili » 2016年11月11日(金) 17:43

ある名前とある説明分が付いたアイテムを使用(食べる・飲む)した際に、
そのアイテムを使用したプレイヤーにエフェクト効果を付与させたいのですが
名前と説明分の一致確認、使用後エフェクト効果付与までの流れがイマイチ分かりません..。
名前と説明分条件付きでのevent検知、効果付与の方法教えて頂きたいです..。
lili
ID:90a8c25c
 

  • (PostNo.287534)

Re: 【総合】トピック立てるまでもない質問【Bukkit Plugin制作】

投稿記事by Lemon18 » 2016年11月11日(金) 18:27

farnoie さんが書きました:アイテムに属性を付与する方法を教えて下さい。
属性とは、例えば体力増加とか移動速度上昇とかです。


https://www.spigotmc.org/threads/1-8-modifying-item-attributes.47558/
これを見れば分かるかと思います。 (CraftBukkitが必要です。) (バージョンが記載されていませんが、他のバージョンでも多分同じような感じだと思います...)

lili さんが書きました:ある名前とある説明分が付いたアイテムを使用(食べる・飲む)した際に、
そのアイテムを使用したプレイヤーにエフェクト効果を付与させたい


まず、これを実現するにはPlayerItemConsumeEventを使用します。
次に、PlayerItemConsumeEvent#getItem()でItemStackを取得します。
そして、ItemStack#getItemMeta()でItemMetaを取得し、 (hasItemMeta()でチェックするのを忘れずに)
あとはItemMeta#getDisplayName(), ItemMeta#getLore()から判定を行い、 (hasDisplayName(), hasLore()でチェックも)
PlayerItemConsumeEvent#getPlayer()で取得したプレイヤーから、LivingEntity#addPotionEffect(PotionEffect)を使用すれば出来ます。
:D
Lemon18
ID:b66be5f3
石掘り
 
記事: 85
登録日時: 2015年6月05日(金) 22:42

1つ前へ次へ

Return to 質問:開発・制作関連

x