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

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

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

投稿記事by King(qpwakaba) » 2016年9月24日(土) 11:03

Sea of trees さんが書きました:Plugin作成初心者です。
ログイン時、プレイヤーにチャットを打たせたいのですがどうすればいいでしょうか?

内容がかなーーり特殊ですが、クライアントの処理として打たせたいのです。
PlayerJoinEventで、 e.getPlayer().chat("チャット打ちました!"); のような文を書くと、鯖側で処理され
クライアントが打っていることにならないのです。
クライアントが手打ちでチャットを打った時と同じ効果を得るにはどうすればよいのでしょうか?
ご教授願います。

尚、In率が低めなので返信が遅れると思われます。返信が遅い場合ごめんなさい。


確かにチャットのパケットが飛んできた場合と player.chat を使った場合とで違いはありますが、その違いが影響するという状況がわかりません。
具体的にどのような点で躓いているのかを書いたほうが回答も集まりやすいかと思います。
以下サイン
調べて見つからないことを質問して、「そのくらい調べろ」と言われたら それは調べが足りないとき。

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

  • (PostNo.283926)

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

投稿記事by Sea of trees » 2016年9月24日(土) 14:19

King(qpwakaba) さんが書きました:
Sea of trees さんが書きました:Plugin作成初心者です。
ログイン時、プレイヤーにチャットを打たせたいのですがどうすればいいでしょうか?

内容がかなーーり特殊ですが、クライアントの処理として打たせたいのです。
PlayerJoinEventで、 e.getPlayer().chat("チャット打ちました!"); のような文を書くと、鯖側で処理され
クライアントが打っていることにならないのです。
クライアントが手打ちでチャットを打った時と同じ効果を得るにはどうすればよいのでしょうか?
ご教授願います。

尚、In率が低めなので返信が遅れると思われます。返信が遅い場合ごめんなさい。


確かにチャットのパケットが飛んできた場合と player.chat を使った場合とで違いはありますが、その違いが影響するという状況がわかりません。
具体的にどのような点で躓いているのかを書いたほうが回答も集まりやすいかと思います。


確かに、何も書かないと意味のないように思えますね...すみません。
内容上詳しくは言えないのですが、ハック対策プラグインを作成しているのです。
クライアントの性質上、.help等のような感じで入力した場合、クライアントコマンドの処理で実行され鯖へパケットが飛んできません。
それを利用し、ログインできなくするという仕組みをとろうと考えています。
勿論、クライアントコマンドの無いクライアント対策としてそれ以外にもいろいろ作成はしていますが、
ほとんどのクライアントに対してこの対策が有効に思えます。

なので、クライアント側が直接手入力で「.help」と入力した時と同じ効果がほしいのです。
長くなって申し訳ありません。このようなことは可能なのでしょうか?
なんか、最近多忙な気がするなぁ....
アバター
Sea of trees
ID:f39b019e
木を殴ってる
 
記事: 32
登録日時: 2015年3月01日(日) 15:27

  • (PostNo.283928)

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

投稿記事by Sea of trees » 2016年9月24日(土) 14:30

syunsyungoto さんが書きました:
Sea of trees さんが書きました:Plugin作成初心者です。
ログイン時、プレイヤーにチャットを打たせたいのですがどうすればいいでしょうか?

内容がかなーーり特殊ですが、クライアントの処理として打たせたいのです。
PlayerJoinEventで、 e.getPlayer().chat("チャット打ちました!"); のような文を書くと、鯖側で処理され
クライアントが打っていることにならないのです。
クライアントが手打ちでチャットを打った時と同じ効果を得るにはどうすればよいのでしょうか?
ご教授願います。

尚、In率が低めなので返信が遅れると思われます。返信が遅い場合ごめんなさい。


Player#chat()メソッドを使用すれば、プレイヤー側からチャットを打ったことと同じ効果を得られるはずです。
クライアントから打った場合とプラグイン側でチャットを打った場合の差がわかりません。そこを教えてください。

憶測ですが、厳密にチャットをクライアントから打たせるという動作をするには NMSの PacketPlayOutChat、IChatBaseComponent などを使えば行けるはずです…



なるほど、NMSは初耳なので一から勉強してみることにします..
貴重な情報ありがとうございます!まだまだ道は長いですが頑張ります!
なんか、最近多忙な気がするなぁ....
アバター
Sea of trees
ID:f39b019e
木を殴ってる
 
記事: 32
登録日時: 2015年3月01日(日) 15:27

  • (PostNo.283956)

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

投稿記事by King(qpwakaba) » 2016年9月24日(土) 19:48

Sea of trees さんが書きました:
syunsyungoto さんが書きました:
Sea of trees さんが書きました:


Player#chat()メソッドを使用すれば、プレイヤー側からチャットを打ったことと同じ効果を得られるはずです。
クライアントから打った場合とプラグイン側でチャットを打った場合の差がわかりません。そこを教えてください。

憶測ですが、厳密にチャットをクライアントから打たせるという動作をするには NMSの PacketPlayOutChat、IChatBaseComponent などを使えば行けるはずです…



なるほど、NMSは初耳なので一から勉強してみることにします..
貴重な情報ありがとうございます!まだまだ道は長いですが頑張ります!


Sea of trees さんが書きました:
King(qpwakaba) さんが書きました:


確かに、何も書かないと意味のないように思えますね...すみません。
内容上詳しくは言えないのですが、ハック対策プラグインを作成しているのです。
クライアントの性質上、.help等のような感じで入力した場合、クライアントコマンドの処理で実行され鯖へパケットが飛んできません。
それを利用し、ログインできなくするという仕組みをとろうと考えています。
勿論、クライアントコマンドの無いクライアント対策としてそれ以外にもいろいろ作成はしていますが、
ほとんどのクライアントに対してこの対策が有効に思えます。

なので、クライアント側が直接手入力で「.help」と入力した時と同じ効果がほしいのです。
長くなって申し訳ありません。このようなことは可能なのでしょうか?


少なくとも自分はそのような手段を知りません。 おそらく不可能かと思います。
そもそも クライアントに任意の文字列を"強制的に"チャット欄へ入力し発言させるという方法はバニラのクライアントには存在していません。
(チャット欄をクリックしたら自動的にコマンドが実行される のようなものはアリますが。これが使えるかどうかもわかりませんし、クリックしてくれるとも限りませんし。)

プラグインという性質上、バニラクライアントとそこで通信されているパケットの改変のみで出来ないことは基本的には出来ないため、
バニラで用意されていない手段は使えない 可能性が非常に高いです。.helpを実際に入力してもらったりなど 代替手段を考えたほうが楽かも。
以下サイン
調べて見つからないことを質問して、「そのくらい調べろ」と言われたら それは調べが足りないとき。

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

  • (PostNo.284111)

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

投稿記事by Sea of trees » 2016年9月25日(日) 22:59

quote文
King(qpwakaba) さんが書きました:
Sea of trees さんが書きました:
syunsyungoto さんが書きました:
Sea of trees さんが書きました:


Player#chat()メソッドを使用すれば、プレイヤー側からチャットを打ったことと同じ効果を得られるはずです。
クライアントから打った場合とプラグイン側でチャットを打った場合の差がわかりません。そこを教えてください。

憶測ですが、厳密にチャットをクライアントから打たせるという動作をするには NMSの PacketPlayOutChat、IChatBaseComponent などを使えば行けるはずです…



なるほど、NMSは初耳なので一から勉強してみることにします..
貴重な情報ありがとうございます!まだまだ道は長いですが頑張ります!


Sea of trees さんが書きました:
King(qpwakaba) さんが書きました:


確かに、何も書かないと意味のないように思えますね...すみません。
内容上詳しくは言えないのですが、ハック対策プラグインを作成しているのです。
クライアントの性質上、.help等のような感じで入力した場合、クライアントコマンドの処理で実行され鯖へパケットが飛んできません。
それを利用し、ログインできなくするという仕組みをとろうと考えています。
勿論、クライアントコマンドの無いクライアント対策としてそれ以外にもいろいろ作成はしていますが、
ほとんどのクライアントに対してこの対策が有効に思えます。

なので、クライアント側が直接手入力で「.help」と入力した時と同じ効果がほしいのです。
長くなって申し訳ありません。このようなことは可能なのでしょうか?


少なくとも自分はそのような手段を知りません。 おそらく不可能かと思います。
そもそも クライアントに任意の文字列を"強制的に"チャット欄へ入力し発言させるという方法はバニラのクライアントには存在していません。
(チャット欄をクリックしたら自動的にコマンドが実行される のようなものはアリますが。これが使えるかどうかもわかりませんし、クリックしてくれるとも限りませんし。)

プラグインという性質上、バニラクライアントとそこで通信されているパケットの改変のみで出来ないことは基本的には出来ないため、
バニラで用意されていない手段は使えない 可能性が非常に高いです。.helpを実際に入力してもらったりなど 代替手段を考えたほうが楽かも。


なるほど...tellrawでクリックしてもらえれば確かにクライアントがチャットを打ったのと同じ効果を得られますね。
やはり強制的に打たせるものはbukkitには存在しないですか。
他の方法がないか模索してみます。
King(qpwakaba)様、syunsyungoto様、ありがとうございました。<m(__)m>
最後に編集したユーザー Sea of trees [ 2016年9月26日(月) 22:18 ], 累計 1 回
なんか、最近多忙な気がするなぁ....
アバター
Sea of trees
ID:f39b019e
木を殴ってる
 
記事: 32
登録日時: 2015年3月01日(日) 15:27

  • (PostNo.284170)

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

投稿記事by ゲスト » 2016年9月26日(月) 21:43

プラグイン製作の練習にアイテムをクリックしたとき、メッセージを送るというものを作りました。
コンフィグからアイテムとメッセージのペアを、複数設定できるようにするにはどうしたらいいですか?


String item = getConfig().getString("Item");
String message = getConfig().getString("Message");

@Override
public void onEnable() {
this.getServer().getPluginManager().registerEvents(this, this);
saveDefaultConfig();
}

@EventHandler
public void onInteract(PlayerInteractEvent event) {
if (event.getPlayer().getInventory().getItemInMainHand().getType() == Material.getMaterial(item)) {
event.getPlayer().sendMessage(message);
}
}


コンフィグ↓

Item: DIAMOND
Message: 'テスト'
ゲスト
ID:9b12332a
 

  • (PostNo.284173)

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

投稿記事by Hinyari_Gohan » 2016年9月26日(月) 22:03

ゲスト さんが書きました:プラグイン製作の練習にアイテムをクリックしたとき、メッセージを送るというものを作りました。
コンフィグからアイテムとメッセージのペアを、複数設定できるようにするにはどうしたらいいですか?


String item = getConfig().getString("Item");
String message = getConfig().getString("Message");

@Override
public void onEnable() {
this.getServer().getPluginManager().registerEvents(this, this);
saveDefaultConfig();
}

@EventHandler
public void onInteract(PlayerInteractEvent event) {
if (event.getPlayer().getInventory().getItemInMainHand().getType() == Material.getMaterial(item)) {
event.getPlayer().sendMessage(message);
}
}


コンフィグ↓

Item: DIAMOND
Message: 'テスト'


コード: 全て選択
Material.valueOf(item.toUpperCase());
で出来ると思います。
Hinyari_Gohanで主に活動しております。
見かけた際はどうぞよろしく。
アバター
Hinyari_Gohan
ID:24300143
石掘り
 
記事: 92
登録日時: 2014年4月19日(土) 09:00

  • (PostNo.284177)

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

投稿記事by ゲスト » 2016年9月26日(月) 22:21

syunsyungotoさん、返信ありがとうございます。
↓のようにしてみたのですが、一つのペアしか動いてくれません。
(解釈が違っていたらすみません)

String item = getConfig().getString("Item");
String message = getConfig().getString("Message");

@Override
public void onEnable() {
this.getServer().getPluginManager().registerEvents(this, this);
saveDefaultConfig();
}

@EventHandler
public void onInteract(PlayerInteractEvent event) {
if (event.getPlayer().getInventory().getItemInMainHand().getType() == Material.valueOf(item.toUpperCase())) {
event.getPlayer().sendMessage(message);
}
}
ゲスト
ID:9b12332a
 

  • (PostNo.284189)

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

投稿記事by hanage120 » 2016年9月27日(火) 00:21

subtitleの下の部分に文字を表示させるため、すべてのプレイヤーにそれぞれのパケットを送信しようと思い下のコードを書いたのですが、一人のプレイヤーにしか反応しませんでした。
解決策があれば教えてください。
よろしくお願いします。

for (Player p : Bukkit.getServer().getOnlinePlayers()) {

IChatBaseComponent comp = ChatSerializer.a(json);
PacketPlayOutChat packet = new PacketPlayOutChat(comp,(byte) 2);
((CraftPlayer)p).getHandle().playerConnection.sendPacket(packet);

}
hanage120
ID:ba9b0039
石掘り
 
記事: 73
登録日時: 2015年3月16日(月) 20:51

  • (PostNo.284195)

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

投稿記事by Hinyari_Gohan » 2016年9月27日(火) 06:49

hanage120 さんが書きました:subtitleの下の部分に文字を表示させるため、すべてのプレイヤーにそれぞれのパケットを送信しようと思い下のコードを書いたのですが、一人のプレイヤーにしか反応しませんでした。
解決策があれば教えてください。
よろしくお願いします。

for (Player p : Bukkit.getServer().getOnlinePlayers()) {

IChatBaseComponent comp = ChatSerializer.a(json);
PacketPlayOutChat packet = new PacketPlayOutChat(comp,(byte) 2);
((CraftPlayer)p).getHandle().playerConnection.sendPacket(packet);

}


これで正常に動作するはずですが…
プレイヤーがサーバーにログインしているか、またエラー等が発生している場合スタックトレースも添付して下さい。(その場合はコード全文を貼り付けてくださいね)

Hinyari_Gohanで主に活動しております。
見かけた際はどうぞよろしく。
アバター
Hinyari_Gohan
ID:24300143
石掘り
 
記事: 92
登録日時: 2014年4月19日(土) 09:00

  • (PostNo.284215)

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

投稿記事by King(qpwakaba) » 2016年9月27日(火) 19:07

syunsyungoto さんが書きました:
ゲスト さんが書きました:プラグイン製作の練習にアイテムをクリックしたとき、メッセージを送るというものを作りました。
コンフィグからアイテムとメッセージのペアを、複数設定できるようにするにはどうしたらいいですか?


String item = getConfig().getString("Item");
String message = getConfig().getString("Message");

@Override
public void onEnable() {
this.getServer().getPluginManager().registerEvents(this, this);
saveDefaultConfig();
}

@EventHandler
public void onInteract(PlayerInteractEvent event) {
if (event.getPlayer().getInventory().getItemInMainHand().getType() == Material.getMaterial(item)) {
event.getPlayer().sendMessage(message);
}
}


コンフィグ↓

Item: DIAMOND
Message: 'テスト'


コード: 全て選択
Material.valueOf(item.toUpperCase());
で出来ると思います。


そもそもコンフィグに同じキーが存在していると、正しく読み込めないため、キーの衝突を回避する必要があります。
config.getKeys() で キーの Setが取得できるので後は拡張forで操作すれば良さそうです。
以下サイン
調べて見つからないことを質問して、「そのくらい調べろ」と言われたら それは調べが足りないとき。

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

  • (PostNo.284541)

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

投稿記事by uz_masa3 » 2016年10月01日(土) 14:30

こんにちは。今JSON形式でScoreBoardのKillとDeathの値を保存しようとしていて一つ問題が発生しました。

現在のコード
コード: 全て選択
ScoreboardManager manager = Bukkit.getScoreboardManager();
Scoreboard board = manager.getMainScoreboard();
JSONObject json = new JSONObject();
JSONObject stats = new JSONObject();
for(OfflinePlayer p : board.getPlayers()){
  stats.put("kill", board.getObjective("Kills").getScore(p.getName()).getScore());
  stats.put("death", board.getObjective("Deaths").getScore(p.getName()).getScore());
  json.put(p.getName(), stats);
}
try{
  FileWriter file = new FileWriter(getDataFolder()+"/status.json");
  file.write(json.toJSONString());
  file.flush();
  file.close();
}catch(IOException e){
  e.printStackTrace();
}


(ScoreBoardのデータは事前に設定して)これで実行したら
コード: 全て選択
{"_Re4l":{"death":4,"kill":3},"uz_masa3":{"death":4,"kill":3}}

となりました。(_Re4lのkillを1、deathを2 uz_masa3のkillを3、deathを4と事前に設定)
問題の場所なんですが、プレイヤーのkillとdeathの値が共有されてしまうとこなんですが、これ以外に複数プレイヤーのデータを取得する方法が思いつかなくて困っております。どの点を修正したらよいでしょうか。
<IGN: uz_masa3>
Masa3MCNetwork Owner
アバター
uz_masa3
ID:037ae348
水から上がったとこ
 
記事: 6
登録日時: 2016年2月27日(土) 22:16

  • (PostNo.284545)

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

投稿記事by ucchy » 2016年10月01日(土) 14:51

uz_masa3さん、

生成したJSONObject
コード: 全て選択
JSONObject stats = new JSONObject();

を、使いまわしていることが原因です。

_Re4lさんのために作った stats という箱に対して、kill=1 と death=2 を設定しましたが、
同じstatsという箱に対してそのままuz_masa3さんの kill=3 death=4 を設定しているので、
_Re4lさんの参照先の箱の中身も書き換わっているのです。

解決するには、箱を使いまわさずに、_Re4lさん用の箱、uz_masa3さん用の箱 をそれぞれ作って設定してあげれば良いです。

コード: 全て選択
ScoreboardManager manager = Bukkit.getScoreboardManager();
Scoreboard board = manager.getMainScoreboard();
JSONObject json = new JSONObject();
for (OfflinePlayer p : board.getPlayers()) {
    JSONObject stats = new JSONObject();
    stats.put("kill", board.getObjective("Kills").getScore(p.getName()).getScore());
    stats.put("death", board.getObjective("Deaths").getScore(p.getName()).getScore());
    json.put(p.getName(), stats);
}
try {
    FileWriter file = new FileWriter(getDataFolder() + "/status.json");
    file.write(json.toJSONString());
    file.flush();
    file.close();
} catch (IOException e) {
    e.printStackTrace();
}



JSONObject stats = new JSONObject(); の行を、1つ下に移動すればいいだけですね。
――お知らせ――
パソコンが壊れたため、買い替えるまで、プラグイン開発作業はお休みしています。簡単な質問程度ならお答えいたします。
――お知らせ――
アバター
ucchy
ID:66dbff26
ラピスラズリ収集家
 
記事: 1171
登録日時: 2012年11月07日(水) 00:08

  • (PostNo.284551)

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

投稿記事by uz_masa3 » 2016年10月01日(土) 15:11

ucchyさん、ありがとうございます。
修正していただいた物で動作確認をさせていただきました。
正常に動作し、望み通りの結果でした。
元コードと修正していただいたコードを見比べたりして学ばせていただきます。
ありがとうございました。
<IGN: uz_masa3>
Masa3MCNetwork Owner
アバター
uz_masa3
ID:037ae348
水から上がったとこ
 
記事: 6
登録日時: 2016年2月27日(土) 22:16

  • (PostNo.284586)

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

投稿記事by すまいる120円 » 2016年10月01日(土) 21:47

1.10.2用のspigot環境での質問です。
コマンドからサイドバーにスコアボードの表示をする場合に(/scoreboard objectives setdisplay sideber 〇〇)
自分自身(op権限保有者?ここの条件もわかりません)にしかスコアボードが表示されないのですが、
これはspigot環境の仕様でしょうか。

以下のことを試しましたが、やはり自分自身にしかスコアボードが表示されません。
・表示するスコアを変えてみる
・他のプレイヤーにop権限を与え、executeでscoreboardコマンドを実行させる
・spigot.ymlのreplace-commandsにscoreboardを追加して実行する

何かご存じの方が居られましたら、ご回答頂ければ幸いです。
すまいる120円
ID:b3e4a3c5
水から上がったとこ
 
記事: 7
登録日時: 2015年5月25日(月) 19:11

  • (PostNo.284594)

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

投稿記事by Hinyari_Gohan » 2016年10月01日(土) 22:43

すまいる120円 さんが書きました:/scoreboard objectives setdisplay sideber 〇〇

sidebar と間違っていませんか。
Hinyari_Gohanで主に活動しております。
見かけた際はどうぞよろしく。
アバター
Hinyari_Gohan
ID:9aad37c5
石掘り
 
記事: 92
登録日時: 2014年4月19日(土) 09:00

  • (PostNo.284608)

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

投稿記事by すまいる120円 » 2016年10月02日(日) 00:25

syunsyungoto さんが書きました:
すまいる120円 さんが書きました:/scoreboard objectives setdisplay sideber 〇〇

sidebar と間違っていませんか。

すみません、書き込む際には間違えていますが実際には正しいコマンドで実行しています。
(実行に成功したログが返ってきていることは確認しています)
他の理由で思い当るものはありませんでしょうか。
すまいる120円
ID:b3e4a3c5
水から上がったとこ
 
記事: 7
登録日時: 2015年5月25日(月) 19:11

  • (PostNo.284669)

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

投稿記事by King(qpwakaba) » 2016年10月02日(日) 14:17

すまいる120円 さんが書きました:1.10.2用のspigot環境での質問です。
コマンドからサイドバーにスコアボードの表示をする場合に(/scoreboard objectives setdisplay sideber 〇〇)
自分自身(op権限保有者?ここの条件もわかりません)にしかスコアボードが表示されないのですが、
これはspigot環境の仕様でしょうか。


一応念のため。このトピック/カテゴリは プラグイン開発用の質問カテゴリなのでマルチサーバー運用カテゴリで質問するのが正しそうです。
もし質問をマルチサーバー運用カテゴリで出し直す場合は 削除依頼/移動依頼を出してからにしてください。

また質問し直すときは 導入プラグイン一覧を記述していただけると原因の特定につながるかと思います。
以下サイン
調べて見つからないことを質問して、「そのくらい調べろ」と言われたら それは調べが足りないとき。

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

  • (PostNo.284733)

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

投稿記事by hanage120 » 2016年10月02日(日) 23:19

Hinyari_Gohan さんが書きました:
hanage120 さんが書きました:subtitleの下の部分に文字を表示させるため、すべてのプレイヤーにそれぞれのパケットを送信しようと思い下のコードを書いたのですが、一人のプレイヤーにしか反応しませんでした。
解決策があれば教えてください。
よろしくお願いします。

for (Player p : Bukkit.getServer().getOnlinePlayers()) {

IChatBaseComponent comp = ChatSerializer.a(json);
PacketPlayOutChat packet = new PacketPlayOutChat(comp,(byte) 2);
((CraftPlayer)p).getHandle().playerConnection.sendPacket(packet);

}


これで正常に動作するはずですが…
プレイヤーがサーバーにログインしているか、またエラー等が発生している場合スタックトレースも添付して下さい。(その場合はコード全文を貼り付けてくださいね)



一つ一つの処理がおもすぎて正しく動いていなかったようです…
ありがとうございました。
hanage120
ID:ba9b0039
石掘り
 
記事: 73
登録日時: 2015年3月16日(月) 20:51

  • (PostNo.285064)

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

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

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

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

エラー内容
コード: 全て選択
[07:21:00 WARN]: Unexpected exception while parsing console command "def game st
op"
org.bukkit.command.CommandException: Unhandled exception executing command 'def'
 in plugin Defense v0.0.1
        at org.bukkit.command.PluginCommand.execute(PluginCommand.java:46) ~[spi
got.jar:git-Spigot-798f32d-0cd0397]
        at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:14
1) ~[spigot.jar:git-Spigot-798f32d-0cd0397]
        at org.bukkit.craftbukkit.v1_9_R2.CraftServer.dispatchCommand(CraftServe
r.java:646) ~[spigot.jar:git-Spigot-798f32d-0cd0397]
        at org.bukkit.craftbukkit.v1_9_R2.CraftServer.dispatchServerCommand(Craf
tServer.java:632) [spigot.jar:git-Spigot-798f32d-0cd0397]
        at net.minecraft.server.v1_9_R2.DedicatedServer.aL(DedicatedServer.java:
437) [spigot.jar:git-Spigot-798f32d-0cd0397]
        at net.minecraft.server.v1_9_R2.DedicatedServer.D(DedicatedServer.java:4
00) [spigot.jar:git-Spigot-798f32d-0cd0397]
        at net.minecraft.server.v1_9_R2.MinecraftServer.C(MinecraftServer.java:6
65) [spigot.jar:git-Spigot-798f32d-0cd0397]
        at net.minecraft.server.v1_9_R2.MinecraftServer.run(MinecraftServer.java
:564) [spigot.jar:git-Spigot-798f32d-0cd0397]
        at java.lang.Thread.run(Unknown Source) [?:1.8.0_60]
Caused by: java.lang.NullPointerException
        at umasyu.defense.Command_game.run(Command_game.java:56) ~[?:?]
        at umasyu.defense.Command_game.<init>(Command_game.java:18) ~[?:?]
        at umasyu.defense.Maincommand.onCommand(Maincommand.java:41) ~[?:?]
        at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44) ~[spi
got.jar:git-Spigot-798f32d-0cd0397]
        ... 8 more


タイマーのソース
コード: 全て選択
package umasyu.defense;

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;

public class Command_game{
    private Main main;
    private CommandSender s;
    private String[] args;
    public BukkitRunnable task;
    public Command_game(Main main,CommandSender s, String[] args){
        this.main = main;
        this.s = s;
        this.args = args;
        run();
    }
   private void run() {
      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")){
               final ConfigHandler config = main.getConfigHandler();
               final int second = config.time;
               task = new BukkitRunnable() {
                  int sec = second;
               @Override
               public void run() {
                  for(Player player : Bukkit.getOnlinePlayers()){
                     player.setLevel(sec);
                  }
                  Bukkit.broadcastMessage(sec+"秒");

                  if(sec == 0){
                     for(Player player : Bukkit.getOnlinePlayers()){
                        player.setLevel(0);
                     }
                     Bukkit.broadcastMessage("ストップ");
                     cancel();
                  }
               sec--;
               }
               };task.runTaskTimer(Main.main, 0, 20);

            }else if(args[1].equalsIgnoreCase("stop")){
               task.cancel();
               return;
            }
        }

   }

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

1つ前へ次へ

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

x