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

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

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

投稿記事by hanage120 » 2017年3月07日(火) 00:33

King(qpwakaba) さんが書きました:
hanage120 さんが書きました:spigot1.8で、spigotのイベントよりも早くブロックの破壊を検知する方法を探しています。
Protocollibを用いてブロックの破壊を検知しようとしたのですが、どのイベントが適切なのかわかりません。
block_digイベントは試したのですが、壊さなくてもクリックだけで反応してしまいます。

なにかよい方法はないでしょうか?


block_dig イベントが PacketPlayInBlockDig パケットのことであれば、EnumPlayerDigTypeに当たるパラメータが STOP_DESTROY_BLOCK (2) であれば処理をする、というように書けば良いと思います。
ProtocolLibに関して何も知らないのでピンポイントな説明ができなくて申し訳ないです。


ところで、そもそも hanage120さんは Spigotのイベントより早くブロック破壊を検知して何をやりたいのでしょうか。
場合によってはパケットの監視 以外にも有効な方法があるのでその意図と教えていただけませんか。



返信が遅くなって申し訳ないです。
実はspigotでは破壊イベントが一回しか起きないのにブロックを大量に破壊するチーターが現れまして、ncpやaacでも反応しなかったので、パケットを見てみようと思い調べ始めました。

お陰様で破壊時にだけ反応するようになりました。
ありがとうございます。
hanage120
ID:f66b0833
石掘り
 
記事: 73
登録日時: 2015年3月16日(月) 20:51

  • (PostNo.297753)

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

投稿記事by takumi000 » 2017年3月11日(土) 11:14

こんにちは。
自分は今「AutoKick」というプラグインを作りながらJavaを勉強しているのですが、PlayerLoginEventの時にconfig.ymlに指定された人以外を自動的にkickする方法がわかりません。どなたか教えてください。

AutoKick.java
コード: 全て選択
package jp.wpblog.spigotplugin.main;

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.event.player.PlayerLoginEvent;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.java.JavaPlugin:

public class AutoKick extends JavaPlugin{

   @Override
   public void onEnable(){
      instance = this;
      getServer().getPluginManager().registerEvents(new PlayerLoginEventListener(), plugin);
      getCommand("autokick").setExecutor(this);
      this.getLogger().info(ChatColor.GOLD + ChatColor.BOLD + "AutoKickをロードしました.");
      saveDefaultConfig();
      getServer().getPluginManager().registerEvents(new Listner(){
         
         @EventHandler
         public void player join(PlayerLoginEvent event){
            //ここからわからない
            
            //ここまで
         }
      }
   }

   @Override
   public void onDisable(){
      this.getLogger().info(ChatColor.GOLD + ChatColor.BOLD + "AutoKickをアンロードしました.");
      this.saveConfig();
   }

   public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[]args){
      if(sender instanceof Player && cmd.getName().equalsIgnoreCase("autokick")){
         if(args.length == 0){
               sender.sendMessage(ChatColor.AQUA + ChatColor.BOLD + "AutoKick Information");
               sender.sendMessage(ChatColor.AQUA + "詳細");
               sender.sendMessage(ChatColor.LIGHT_PURPLE + "configで指定したプレイヤー以外をすべてkickします.");
               sender.sendMessage(ChatColor.AQUA + "コマンド");
               sender.sendMessage(ChatColor.LIGHT_PURPLE + "/autokick : AutoKickについての情報を表示します.");
               sender.sendMessage(ChatColor.LIGHT_PURPLE + "/autokick reload : AutoKickをリロードします");
         } else if(args.length == 1 && args[0].equalsIgnoreCase("reload")){
               this.reloadConfig();
               this.saveConfig();
               sender.sendMessage(ChatColor.RED + "この機能はまだ実装されていません");
               sender.sendMessage(ChatColor.RED + "次回アップデートまでお待ちください");
         }
      }
   }
}


config.yml(例)
コード: 全て選択
# 下にプレイヤー名を1行ずつ入力してください。
Aさん
Bさん
Cさん
Javaの勉強をしながらPlugin開発もやってたり。
RNTサーバーのResponsibleもやってます。
takumi000
ID:808dbd33
木を殴ってる
 
記事: 32
登録日時: 2015年9月07日(月) 14:46
お住まい: RNTサーバー

  • (PostNo.297767)

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

投稿記事by King(qpwakaba) » 2017年3月11日(土) 13:23

takumi000 さんが書きました:こんにちは。
自分は今「AutoKick」というプラグインを作りながらJavaを勉強しているのですが、PlayerLoginEventの時にconfig.ymlに指定された人以外を自動的にkickする方法がわかりません。どなたか教えてください。


大まかな処理の流れは、

  1. ログインしたプレイヤーのID(UUID推奨) を取得する。
  2. コンフィグに記載されているID(UUID)に含まれるかどうかを調べる。
  3. コンフィグに含まれていたら含まれていなければキックする
    失礼いたしました、逆でしたね。

となります。わからない部分があればまた部分的に質問してください。
最後に編集したユーザー King(qpwakaba) [ 2017年3月11日(土) 20:04 ], 累計 1 回
以下サイン
調べて見つからないことを質問して、「そのくらい調べろ」と言われたら それは調べが足りないとき。

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

  • (PostNo.297803)

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

投稿記事by amata1219 » 2017年3月11日(土) 18:34

takumi000 さんが書きました:こんにちは。
自分は今「AutoKick」というプラグインを作りながらJavaを勉強しているのですが、PlayerLoginEventの時にconfig.ymlに指定された人以外を自動的にkickする方法がわかりません。どなたか教えてください。

AutoKick.java
コード: 全て選択
package jp.wpblog.spigotplugin.main;

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.event.player.PlayerLoginEvent;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.java.JavaPlugin:

public class AutoKick extends JavaPlugin{

   @Override
   public void onEnable(){
      instance = this;
      getServer().getPluginManager().registerEvents(new PlayerLoginEventListener(), plugin);
      getCommand("autokick").setExecutor(this);
      this.getLogger().info(ChatColor.GOLD + ChatColor.BOLD + "AutoKickをロードしました.");
      saveDefaultConfig();
      getServer().getPluginManager().registerEvents(new Listner(){
         
         @EventHandler
         public void player join(PlayerLoginEvent event){
            //ここからわからない
            
            //ここまで
         }
      }
   }

   @Override
   public void onDisable(){
      this.getLogger().info(ChatColor.GOLD + ChatColor.BOLD + "AutoKickをアンロードしました.");
      this.saveConfig();
   }

   public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[]args){
      if(sender instanceof Player && cmd.getName().equalsIgnoreCase("autokick")){
         if(args.length == 0){
               sender.sendMessage(ChatColor.AQUA + ChatColor.BOLD + "AutoKick Information");
               sender.sendMessage(ChatColor.AQUA + "詳細");
               sender.sendMessage(ChatColor.LIGHT_PURPLE + "configで指定したプレイヤー以外をすべてkickします.");
               sender.sendMessage(ChatColor.AQUA + "コマンド");
               sender.sendMessage(ChatColor.LIGHT_PURPLE + "/autokick : AutoKickについての情報を表示します.");
               sender.sendMessage(ChatColor.LIGHT_PURPLE + "/autokick reload : AutoKickをリロードします");
         } else if(args.length == 1 && args[0].equalsIgnoreCase("reload")){
               this.reloadConfig();
               this.saveConfig();
               sender.sendMessage(ChatColor.RED + "この機能はまだ実装されていません");
               sender.sendMessage(ChatColor.RED + "次回アップデートまでお待ちください");
         }
      }
   }
}


config.yml(例)
コード: 全て選択
# 下にプレイヤー名を1行ずつ入力してください。
Aさん
Bさん
Cさん


King(qpwakaba)様がご回答を訂正なさいましたので非表示にしておきます。

takumi000さん、こんにちは。
理想の動作は"config.ymlに記載されていないプレイヤーのみキック"することのように見受けられますので、その動作を構築する流れを説明しますね。
ログインしたプレイヤーとconfig.ymlに記載されているプレイヤーの比較はKing(qpwakaba)さんの仰られているように、一般的にはUUIDが推奨されます。
ご存知かと思いますが一応手短な解説をしておきますね。UUIDは各プレイヤーに紐付けされている識別名であり、プレイヤー名とは違い変更することの出来ないIDです。ということで、UUIDを使用することによってプレイヤー名変更によるトラブル発生を回避することができますね。
全体の流れとしては、PlayerLoginEventでプレイヤーとUUIDを取得し、config.ymlに記載されているUUIDをfor文で1つずつ比較します。
プレイヤーのキックは、
コード: 全て選択
event.getPlayer().kickPlayer("message");

といった感じで出来ます。messageはプレイヤーがキックされた際に、そのプレイヤーに対して表示するメッセージです。
config.ymlでのUUIDのリスト化は下記コードの形で記載するのが望ましいです。
配列の読み取りはList<String>型で取得出来ます。
コード: 全て選択
UUIDlist:
- uuid1
- uuid2
- uuid3

コンフィグ設定については、こちらにチュートリアルがありますので一度目を通しておくといいですよ。
http://urx.red/Cdsh
最後に編集したユーザー amata1219 [ 2017年3月23日(木) 20:23 ], 累計 3 回
アバター
amata1219
ID:e1938bc3
木を殴ってる
 
記事: 13
登録日時: 2016年11月18日(金) 16:46
お住まい: 愛知県

  • (PostNo.298118)

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

投稿記事by mame3619 » 2017年3月15日(水) 15:58

こんにちは。
私はいま、プラグインを作りつつ、Javaを学んでいますが実績解除の際に画面右上に出るものがありますよね?
それを、好きな文字にかえ、好きな時に出せるようにしたいのですが、可能でしょうか?
mame3619
ID:aa0df3a3
 

  • (PostNo.298121)

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

投稿記事by Farron_Claire » 2017年3月15日(水) 16:02

私も気になります><
Farron_Claire
ID:7bb3e3ec
 

  • (PostNo.298129)

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

投稿記事by amata1219 » 2017年3月15日(水) 17:43

mame3619 さんが書きました:こんにちは。
私はいま、プラグインを作りつつ、Javaを学んでいますが実績解除の際に画面右上に出るものがありますよね?
それを、好きな文字にかえ、好きな時に出せるようにしたいのですが、可能でしょうか?


mame3619さん、こんにちは。
結論から言いますと不可能です。
実績解除時に画面右上に表示されるポップアップはクライアント側で処理されています。
ですのでそういった操作をプラグインで処理することは出来ません。
ですが、実績解除時にはPlayerAchievementAwardedEventというイベントが発生しますので、それを利用して別の処理をすることは可能です。
また、特定の行動時にサーバー内チャットにメッセージを送信する等の処理をすれば擬似的に新しい実績を作ることは出来ますよ。
アバター
amata1219
ID:e1938bc3
木を殴ってる
 
記事: 13
登録日時: 2016年11月18日(金) 16:46
お住まい: 愛知県

  • (PostNo.298148)

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

投稿記事by mame3619 » 2017年3月15日(水) 21:41

amata1219さん。お忙しい中お早い返信ありがとうございます。
右上のポップアップを別なことに使えないかなと思っておりましたゆえ、質問させていただきました。
別な方法を考えようかと思います。
大変ありがとうございました。
mame3619
ID:aa0df3a3
 

  • (PostNo.298687)

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

投稿記事by 東脳君 » 2017年3月22日(水) 19:43

数時間程ディスプレイと睨み合っても解決しなかったので質問させて頂きます。

現在、プレーヤーが落下ダメージを受けた際に
頭スロットに名前付きのガラスがセットされているかを確認し、
もしセットされていれば効果音とパーティクルを表示しガラスを削除する、という処理を行うプラグインを制作しています。
ガラスがセットされた状態でダメージを受けるときちんとパーティクル表示や効果音の再生、ガラス削除も正常に行われるのですが、

ガラスがセットされていない状態では落下だけでなく全てのダメージを受けるたびにサーバーにエラーログが表示されて困っています。
どうにかしてこのエラーログを表示しないようにする解決策はありませんでしょうか?

文章に乱れが生じており大変読みづらいかとは思いますがよろしくお願いします。

エラーログ
Could not pass event EntityDamageEvent to KIYOHARAPLUGIN v1.8.x
org.bukkit.event.EventException
at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:297) ~[craftbukkit.jar:git-Bukkit-33d5de3]
at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[craftbukkit.jar:git-Bukkit-33d5de3]
at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:501) [craftbukkit.jar:git-Bukkit-33d5de3]
at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:486) [craftbukkit.jar:git-Bukkit-33d5de3]
at org.bukkit.craftbukkit.v1_8_R1.event.CraftEventFactory.callEvent(CraftEventFactory.java:84) [craftbukkit.jar:git-Bukkit-33d5de3]
at org.bukkit.craftbukkit.v1_8_R1.event.CraftEventFactory.callEntityDamageEvent(CraftEventFactory.java:521) [craftbukkit.jar:git-Bukkit-33d5de3]
at org.bukkit.craftbukkit.v1_8_R1.event.CraftEventFactory.handleEntityDamageEvent(CraftEventFactory.java:507) [craftbukkit.jar:git-Bukkit-33d5de3]
at org.bukkit.craftbukkit.v1_8_R1.event.CraftEventFactory.handleLivingEntityDamageEvent(CraftEventFactory.java:553) [craftbukkit.jar:git-Bukkit-33d5de3]
at net.minecraft.server.v1_8_R1.EntityLiving.d(EntityLiving.java:1086) [craftbukkit.jar:git-Bukkit-33d5de3]
at net.minecraft.server.v1_8_R1.EntityHuman.d(EntityHuman.java:854) [craftbukkit.jar:git-Bukkit-33d5de3]
at net.minecraft.server.v1_8_R1.EntityLiving.damageEntity(EntityLiving.java:727) [craftbukkit.jar:git-Bukkit-33d5de3]
at net.minecraft.server.v1_8_R1.EntityHuman.damageEntity(EntityHuman.java:795) [craftbukkit.jar:git-Bukkit-33d5de3]
at net.minecraft.server.v1_8_R1.EntityPlayer.damageEntity(EntityPlayer.java:471) [craftbukkit.jar:git-Bukkit-33d5de3]
at net.minecraft.server.v1_8_R1.EntityLiving.e(EntityLiving.java:923) [craftbukkit.jar:git-Bukkit-33d5de3]
at net.minecraft.server.v1_8_R1.EntityHuman.e(EntityHuman.java:1435) [craftbukkit.jar:git-Bukkit-33d5de3]
at net.minecraft.server.v1_8_R1.Block.a(Block.java:591) [craftbukkit.jar:git-Bukkit-33d5de3]
at net.minecraft.server.v1_8_R1.Entity.a(Entity.java:792) [craftbukkit.jar:git-Bukkit-33d5de3]
at net.minecraft.server.v1_8_R1.EntityLiving.a(EntityLiving.java:149) [craftbukkit.jar:git-Bukkit-33d5de3]
at net.minecraft.server.v1_8_R1.EntityPlayer.a(EntityPlayer.java:597) [craftbukkit.jar:git-Bukkit-33d5de3]
at net.minecraft.server.v1_8_R1.PlayerConnection.a(PlayerConnection.java:429) [craftbukkit.jar:git-Bukkit-33d5de3]
at net.minecraft.server.v1_8_R1.PacketPlayInFlying.a(SourceFile:126) [craftbukkit.jar:git-Bukkit-33d5de3]
at net.minecraft.server.v1_8_R1.PacketPlayInPosition.a(SourceFile:57) [craftbukkit.jar:git-Bukkit-33d5de3]
at net.minecraft.server.v1_8_R1.PacketHandleTask.run(SourceFile:13) [craftbukkit.jar:git-Bukkit-33d5de3]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_121]
at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_121]
at net.minecraft.server.v1_8_R1.MinecraftServer.z(MinecraftServer.java:656) [craftbukkit.jar:git-Bukkit-33d5de3]
at net.minecraft.server.v1_8_R1.DedicatedServer.z(DedicatedServer.java:284) [craftbukkit.jar:git-Bukkit-33d5de3]
at net.minecraft.server.v1_8_R1.MinecraftServer.y(MinecraftServer.java:609) [craftbukkit.jar:git-Bukkit-33d5de3]
at net.minecraft.server.v1_8_R1.MinecraftServer.run(MinecraftServer.java:517) [craftbukkit.jar:git-Bukkit-33d5de3]
at java.lang.Thread.run(Thread.java:745) [?:1.8.0_121]
Caused by: java.lang.NullPointerException
at my.kiyohara.Kiyoharaplugin.AXEDAMAGEEX(Kiyoharaplugin.java:2089) ~[?:?]
at sun.reflect.GeneratedMethodAccessor53.invoke(Unknown Source) ~[?:?]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_121]
at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_121]
at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:295) ~[craftbukkit.jar:git-Bukkit-33d5de3]
... 29 more


コード
コード: 全て選択
   @EventHandler
   public void AXEDAMAGEEX(EntityDamageEvent e){
   Entity IKU = e.getEntity();
   if (IKU instanceof Player) {
   Player Player = (Player) IKU;
   if(e.getEntity().getType().equals(EntityType.PLAYER)){

 if(Player.getEquipment().getHelmet().getType().equals(Material.GLASS)){ //2089行目 ここにてエラーが発生する模様

if (e.getCause().equals(DamageCause.FALL)
   && (Player.getEquipment().getHelmet().getItemMeta().getDisplayName().equals(ChatColor.RED + "1531513513"))
   ){

   ParticleEffect.BLOCK_CRACK.display(new BlockData(Material.STONE,(byte)0), 2f, 2f, 2f, 0f, 120,Player.getLocation(), 15);
   ParticleEffect.EXPLOSION_NORMAL.display(2f, 2f, 2f, 0f, 4,Player.getLocation(), 15);

   ItemStack item = new ItemStack(Material.AIR);
   Player.getEquipment().setHelmet(item);
   Player.updateInventory();

   Player.getWorld().playSound(Player.getLocation(),Sound.ZOMBIE_WOODBREAK,1,1);
   Player.getWorld().playSound(Player.getLocation(),Sound.ZOMBIE_REMEDY,1,0.7f);
   }
   }
   }
   }
   }


その他
ParticleEffect Library v1.7
https://bukkit.org/threads/1-8-particle ... -7.154406/
開発環境はEclipse、APIはSPIGOTの1.8.3です。

何か質問、貼り方等に問題などありましたらご指摘して頂くと幸いです。
東脳君
ID:84d1be64
水から上がったとこ
 
記事: 6
登録日時: 2017年3月22日(水) 19:34

  • (PostNo.298698)

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

投稿記事by amata1219 » 2017年3月22日(水) 21:12

東脳君 さんが書きました:数時間程ディスプレイと睨み合っても解決しなかったので質問させて頂きます。

現在、プレーヤーが落下ダメージを受けた際に
頭スロットに名前付きのガラスがセットされているかを確認し、
もしセットされていれば効果音とパーティクルを表示しガラスを削除する、という処理を行うプラグインを制作しています。
ガラスがセットされた状態でダメージを受けるときちんとパーティクル表示や効果音の再生、ガラス削除も正常に行われるのですが、

ガラスがセットされていない状態では落下だけでなく全てのダメージを受けるたびにサーバーにエラーログが表示されて困っています。
どうにかしてこのエラーログを表示しないようにする解決策はありませんでしょうか?

文章に乱れが生じており大変読みづらいかとは思いますがよろしくお願いします。

エラーログ
Could not pass event EntityDamageEvent to KIYOHARAPLUGIN v1.8.x
org.bukkit.event.EventException
at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:297) ~[craftbukkit.jar:git-Bukkit-33d5de3]
at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[craftbukkit.jar:git-Bukkit-33d5de3]
at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:501) [craftbukkit.jar:git-Bukkit-33d5de3]
at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:486) [craftbukkit.jar:git-Bukkit-33d5de3]
at org.bukkit.craftbukkit.v1_8_R1.event.CraftEventFactory.callEvent(CraftEventFactory.java:84) [craftbukkit.jar:git-Bukkit-33d5de3]
at org.bukkit.craftbukkit.v1_8_R1.event.CraftEventFactory.callEntityDamageEvent(CraftEventFactory.java:521) [craftbukkit.jar:git-Bukkit-33d5de3]
at org.bukkit.craftbukkit.v1_8_R1.event.CraftEventFactory.handleEntityDamageEvent(CraftEventFactory.java:507) [craftbukkit.jar:git-Bukkit-33d5de3]
at org.bukkit.craftbukkit.v1_8_R1.event.CraftEventFactory.handleLivingEntityDamageEvent(CraftEventFactory.java:553) [craftbukkit.jar:git-Bukkit-33d5de3]
at net.minecraft.server.v1_8_R1.EntityLiving.d(EntityLiving.java:1086) [craftbukkit.jar:git-Bukkit-33d5de3]
at net.minecraft.server.v1_8_R1.EntityHuman.d(EntityHuman.java:854) [craftbukkit.jar:git-Bukkit-33d5de3]
at net.minecraft.server.v1_8_R1.EntityLiving.damageEntity(EntityLiving.java:727) [craftbukkit.jar:git-Bukkit-33d5de3]
at net.minecraft.server.v1_8_R1.EntityHuman.damageEntity(EntityHuman.java:795) [craftbukkit.jar:git-Bukkit-33d5de3]
at net.minecraft.server.v1_8_R1.EntityPlayer.damageEntity(EntityPlayer.java:471) [craftbukkit.jar:git-Bukkit-33d5de3]
at net.minecraft.server.v1_8_R1.EntityLiving.e(EntityLiving.java:923) [craftbukkit.jar:git-Bukkit-33d5de3]
at net.minecraft.server.v1_8_R1.EntityHuman.e(EntityHuman.java:1435) [craftbukkit.jar:git-Bukkit-33d5de3]
at net.minecraft.server.v1_8_R1.Block.a(Block.java:591) [craftbukkit.jar:git-Bukkit-33d5de3]
at net.minecraft.server.v1_8_R1.Entity.a(Entity.java:792) [craftbukkit.jar:git-Bukkit-33d5de3]
at net.minecraft.server.v1_8_R1.EntityLiving.a(EntityLiving.java:149) [craftbukkit.jar:git-Bukkit-33d5de3]
at net.minecraft.server.v1_8_R1.EntityPlayer.a(EntityPlayer.java:597) [craftbukkit.jar:git-Bukkit-33d5de3]
at net.minecraft.server.v1_8_R1.PlayerConnection.a(PlayerConnection.java:429) [craftbukkit.jar:git-Bukkit-33d5de3]
at net.minecraft.server.v1_8_R1.PacketPlayInFlying.a(SourceFile:126) [craftbukkit.jar:git-Bukkit-33d5de3]
at net.minecraft.server.v1_8_R1.PacketPlayInPosition.a(SourceFile:57) [craftbukkit.jar:git-Bukkit-33d5de3]
at net.minecraft.server.v1_8_R1.PacketHandleTask.run(SourceFile:13) [craftbukkit.jar:git-Bukkit-33d5de3]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_121]
at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_121]
at net.minecraft.server.v1_8_R1.MinecraftServer.z(MinecraftServer.java:656) [craftbukkit.jar:git-Bukkit-33d5de3]
at net.minecraft.server.v1_8_R1.DedicatedServer.z(DedicatedServer.java:284) [craftbukkit.jar:git-Bukkit-33d5de3]
at net.minecraft.server.v1_8_R1.MinecraftServer.y(MinecraftServer.java:609) [craftbukkit.jar:git-Bukkit-33d5de3]
at net.minecraft.server.v1_8_R1.MinecraftServer.run(MinecraftServer.java:517) [craftbukkit.jar:git-Bukkit-33d5de3]
at java.lang.Thread.run(Thread.java:745) [?:1.8.0_121]
Caused by: java.lang.NullPointerException
at my.kiyohara.Kiyoharaplugin.AXEDAMAGEEX(Kiyoharaplugin.java:2089) ~[?:?]
at sun.reflect.GeneratedMethodAccessor53.invoke(Unknown Source) ~[?:?]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_121]
at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_121]
at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:295) ~[craftbukkit.jar:git-Bukkit-33d5de3]
... 29 more


コード
コード: 全て選択
   @EventHandler
   public void AXEDAMAGEEX(EntityDamageEvent e){
   Entity IKU = e.getEntity();
   if (IKU instanceof Player) {
   Player Player = (Player) IKU;
   if(e.getEntity().getType().equals(EntityType.PLAYER)){

 if(Player.getEquipment().getHelmet().getType().equals(Material.GLASS)){ //2089行目 ここにてエラーが発生する模様

if (e.getCause().equals(DamageCause.FALL)
   && (Player.getEquipment().getHelmet().getItemMeta().getDisplayName().equals(ChatColor.RED + "1531513513"))
   ){

   ParticleEffect.BLOCK_CRACK.display(new BlockData(Material.STONE,(byte)0), 2f, 2f, 2f, 0f, 120,Player.getLocation(), 15);
   ParticleEffect.EXPLOSION_NORMAL.display(2f, 2f, 2f, 0f, 4,Player.getLocation(), 15);

   ItemStack item = new ItemStack(Material.AIR);
   Player.getEquipment().setHelmet(item);
   Player.updateInventory();

   Player.getWorld().playSound(Player.getLocation(),Sound.ZOMBIE_WOODBREAK,1,1);
   Player.getWorld().playSound(Player.getLocation(),Sound.ZOMBIE_REMEDY,1,0.7f);
   }
   }
   }
   }
   }


その他
ParticleEffect Library v1.7
https://bukkit.org/threads/1-8-particle ... -7.154406/
開発環境はEclipse、APIはSPIGOTの1.8.3です。

何か質問、貼り方等に問題などありましたらご指摘して頂くと幸いです。


東脳君さん、こんにちは。

結論から言いますとガラスの存在を確認する前に頭に乗せている物の有無を確認していないのでエラーが発生します。
nullチェックを行うだけで簡単に解決出来ますよ。

コード: 全て選択
if(Player.getEquipment().getHelmet().getType().equals(Material.GLASS))


2089行目の上記コードの前に、

コード: 全て選択
if(Player.getEquipment().getHelmet() != null)


と書き加えるだけです。

そしてもう1つ言わせて頂きますと、アイテムのディスプレイネームの比較前にもnullチェックをするといいですよ。
最後に編集したユーザー amata1219 [ 2017年3月22日(水) 21:36 ], 累計 2 回
アバター
amata1219
ID:e1938bc3
木を殴ってる
 
記事: 13
登録日時: 2016年11月18日(金) 16:46
お住まい: 愛知県

  • (PostNo.298700)

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

投稿記事by King(qpwakaba) » 2017年3月22日(水) 21:14

東脳君 さんが書きました:


NullPointerException とはどのようなときに発生する例外(≒エラー) かご存知でしょうか。
知っている場合は読み飛ばしてください
NullPointerExceptionを発生させるコードです
code=php とするとシンタックスハイライトされるらしいので

コード: 全て選択

String hoge 
= null;
System.out.println(hoge.length()); //hoge の文字数を表示する
 
この時、hoge.length() を処理するタイミングでNullPointerException が発生します。
つまり、簡単に書くと null.{何らかのメソッド}() や、 null.{何らかのメンバ(≒変数)} に対してアクセスしたときに発生します。


2089行目でnullになる可能性があるのは、
if(Player.getEquipment().getHelmet().getType().equals(Material.GLASS)){ //2089行目 ここにてエラーが発生する模様


この部分ですね。 例えばプレイヤーが頭に何も装備していないときにnullになったりします。(たぶん)
ここでnullチェックを行えば回避できそうですね。

余談
ItemStackを取得するメソッドでは、そのスロットに何もアイテムがない場合、
  • null
  • (getType() == Material.AIR)
の2通りが取得されます。(メソッドによって違う)

このため、そのスロットに何もない ということを確認するには
  • nullである
  • getTypeがAIRである
のどちらかを満たす という条件式で確認することができます。


余談2
このコードをパット見たとき、2089行目の Player は変数だと思いますか? それとも org.bukkit.entity.Player の省略形だと思いますか?
基本的に、型名と全く同じつづり(大文字小文字も) の変数名をつけることはあまりおすすめできません。
Javaでは、多くのライブラリが、以下のような規則で命名されます。
  • 単語間はスペースを開けたりアンダーバーを入れたりせず、単語の頭文字を大文字にする
  • ただし、先頭の単語のみ、小文字で書く
例えば getPlayer だとか、 getType だとかも同じような形で書かれています。
人によって(また普段扱うプログラミング言語によって)どう書くかは様々ですが、特にルールを定めていないのであれば、Javaと同じルールに合わせることをおすすめします。
以下サイン
調べて見つからないことを質問して、「そのくらい調べろ」と言われたら それは調べが足りないとき。

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

  • (PostNo.298735)

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

投稿記事by 東脳君 » 2017年3月23日(木) 12:58

King(qpwakaba)さん、 amata1219 さん、迅速な回答ありがとうございます。
なるほど、ヌルポイントエラーは虚無にアクセスした際に発生するのですね。
知らずに使っていたので助かりました。
ヌルポイントチェックを行うことによって他に発生していたエラーログもすべて消し去ることができ、
私のプラグインもより完全体に近づくことができました。有難うございます。

一応解決したコードを載せておきます
コード: 全て選択
          @EventHandler
          public void AXEDAMAGEEX(EntityDamageEvent e){
              Entity IKU = e.getEntity();
              if (IKU instanceof Player) {
              Player dlayer = (Player) IKU;
             if(e.getEntity().getType().equals(EntityType.PLAYER)){
                if(dlayer.getEquipment().getHelmet() != null){
                
                  if(dlayer.getEquipment().getHelmet().getType().equals(Material.GLASS)){
                     
                    if(dlayer.getEquipment().getHelmet().getItemMeta().getDisplayName() != null){
                        if (e.getCause().equals(DamageCause.FALL)
                        && (dlayer.getEquipment().getHelmet().getItemMeta().getDisplayName().equals(ChatColor.RED + "1531513513"))
                           ){
                     
                     ParticleEffect.BLOCK_CRACK.display(new BlockData(Material.STONE,(byte)0), 2f, 2f, 2f, 0f, 120,dlayer.getLocation(), 15);
                     ParticleEffect.EXPLOSION_NORMAL.display(2f, 2f, 2f, 0f, 4,dlayer.getLocation(), 15);
                    
                 ItemStack item = new ItemStack(Material.AIR);
                 dlayer.getEquipment().setHelmet(item);
                dlayer.updateInventory();
                   
                   dlayer.getWorld().playSound(dlayer.getLocation(),Sound.ZOMBIE_WOODBREAK,1,1);
                   dlayer.getWorld().playSound(dlayer.getLocation(),Sound.ZOMBIE_REMEDY,1,0.7f);
                        }
                        }
                }
             }
             }
          }
          }


回答を下さったお二人方には本当に感謝しております。
今後もここに質問するかもしれないので何とぞ御覚悟ください。
東脳君
ID:84d1be64
水から上がったとこ
 
記事: 6
登録日時: 2017年3月22日(水) 19:34

  • (PostNo.298741)

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

投稿記事by King(qpwakaba) » 2017年3月23日(木) 14:14

東脳君 さんが書きました:一応解決したコードを載せておきます
コード: 全て選択
          @EventHandler
          public void AXEDAMAGEEX(EntityDamageEvent e){
              Entity IKU = e.getEntity();
              if (IKU instanceof Player) {
              Player dlayer = (Player) IKU;
             if(e.getEntity().getType().equals(EntityType.PLAYER)){
                if(dlayer.getEquipment().getHelmet() != null){
                
                  if(dlayer.getEquipment().getHelmet().getType().equals(Material.GLASS)){
                     
                    if(dlayer.getEquipment().getHelmet().getItemMeta().getDisplayName() != null){
                        if (e.getCause().equals(DamageCause.FALL)
                        && (dlayer.getEquipment().getHelmet().getItemMeta().getDisplayName().equals(ChatColor.RED + "1531513513"))
                           ){
                     
                     ParticleEffect.BLOCK_CRACK.display(new BlockData(Material.STONE,(byte)0), 2f, 2f, 2f, 0f, 120,dlayer.getLocation(), 15);
                     ParticleEffect.EXPLOSION_NORMAL.display(2f, 2f, 2f, 0f, 4,dlayer.getLocation(), 15);
                    
                 ItemStack item = new ItemStack(Material.AIR);
                 dlayer.getEquipment().setHelmet(item);
                dlayer.updateInventory();
                   
                   dlayer.getWorld().playSound(dlayer.getLocation(),Sound.ZOMBIE_WOODBREAK,1,1);
                   dlayer.getWorld().playSound(dlayer.getLocation(),Sound.ZOMBIE_REMEDY,1,0.7f);
                        }
                        }
                }
             }
             }
          }
          }

dlayerじゃなくてplayerのほうが良いのでは。。。 Playerだとわかりづらいけどplayerなら小文字になっているから型名でないという判断ができますぞ
以下サイン
調べて見つからないことを質問して、「そのくらい調べろ」と言われたら それは調べが足りないとき。

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

  • (PostNo.299606)

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

投稿記事by うましゅー » 2017年4月03日(月) 02:50

雪玉を敵のチームに当てた際にサイドバーに表示させている自分のCoinを増やすという処理を書いたのですが、エラーログなしで2人で試した場合片方が増えてそれに合わせてもう片方が同じ数増えるという謎の挙動を起こしてしまいよくわからなくなってます…
コード: 全て選択
//HashMapの形
   public static HashMap<Player, Integer> coin = new HashMap<>();
//イベントで雪玉に当たった時の判定
   @EventHandler
   public void SnowballDamage(EntityDamageByEntityEvent event){
      if(event.getDamager() instanceof Snowball&&event.getEntity() instanceof Player){
         Snowball snowball = (Snowball)event.getDamager();
         Player shooter = (Player)snowball.getShooter();
         Player damageplayer = (Player) event.getEntity();
         Team shooterteam = Main.sb.getEntryTeam(shooter.getName());
         Team damageteam = Main.sb.getEntryTeam(damageplayer.getName());
         Team red = Main.sb.getTeam("red");
         Team blue = Main.sb.getTeam("blue");
         if((damageteam == null||(damageteam != null&&!(shooterteam.equals(red)||shooterteam.equals(blue))))&&(shooterteam != null&&(damageteam.equals(red)||damageteam.equals(blue)))){
            event.setCancelled(true);
            return;
         }else if((shooterteam != null&&(shooterteam.equals(red)||shooterteam.equals(blue)))&&(damageteam == null||(damageteam != null&&!(damageteam.equals(red)||damageteam.equals(blue))))){
            event.setCancelled(true);
            return;
         }
         if(Game_Invincible.invincible.contains(damageplayer)){
            event.setCancelled(true);
            return;
         }
         if((shooterteam != null&&(shooterteam.equals(red)||shooterteam.equals(blue)))&&(damageteam != null&&(damageteam.equals(red)||damageteam.equals(blue)))&&Main.Timer != null){
            SnowballDecision(shooter, damageplayer);
            event.setCancelled(true);
            return;
         }
      }
   }
//雪玉が当たった際の処理 ここでcoinを増やしてputしてあるがスコアボードの表示がおかしくなる
//なお実際にコインの数をmessageで表示した場合は正常
   public void SnowballDecision(Player shooter,Player damageplayer){
      Team shooterteam = Main.sb.getEntryTeam(shooter.getName());
      Team damageteam = Main.sb.getEntryTeam(damageplayer.getName());
      Team red = Main.sb.getTeam("red");
      Team blue = Main.sb.getTeam("blue");
      if(shooterteam != null&&shooterteam.equals(red)){
         --Game_Timer.bluepoint;
      }else if(shooterteam != null&&shooterteam.equals(blue)){
         --Game_Timer.redpoint;
      }
      Integer coin = Game_Timer.coin.get(shooter);
      ++coin;
      Game_Timer.coin.put(shooter, coin);
      if(Game_Timer.redpoint == 0||Game_Timer.bluepoint == 0){
         for(Player player : Bukkit.getOnlinePlayers()){
            String target = player.getName();
             Team team = Main.sb.getEntryTeam(target);
             if(Game_Timer.redpoint == 0){
                player.sendMessage(ChatColor.GREEN+""+ChatColor.BOLD+"[TSB]"+
                  ChatColor.BLUE+"赤チームの残機が無くなった為青チームの勝利です");
             }else if(Game_Timer.bluepoint == 0){
                player.sendMessage(ChatColor.GREEN+""+ChatColor.BOLD+"[TSB]"+
                  ChatColor.RED+"青チームの残機が無くなった為赤チームの勝利です");
             }
             if(team != null&&(team.equals(red)||team.equals(blue))){
               player.getInventory().clear();
               player.setHealth(20);
               player.teleport(PluginConfig.EndLocation());
               Command_remove.remove(player);
               ScoreboardSystem.CancelObject(player);
            }
         }
         Game_Timer.coin.clear();
         Game_Timer.bar.removeAll();
         Game_Invincible.invincible.clear();
         Main.Timer.cancel();
         Main.setTimer(null);
      }else{
         PlayerInventory sinventory = shooter.getInventory();
         sinventory.addItem(new ItemStack(Material.SNOW_BALL,10));
         PlayerInventory dinventory = damageplayer.getInventory();
         dinventory.clear();
         shooter.playSound(shooter.getLocation(), Sound.BLOCK_NOTE_PLING, 1, 1);
         damageplayer.playSound(damageplayer.getLocation(), Sound.BLOCK_NOTE_PLING, 1, 1);
         Game_Timer.distribution(damageplayer, damageteam);
         if(damageteam != null&&damageteam.equals(red)){
            damageplayer.teleport(TeamTeleportConfig.RedLocation());
         }else if(damageteam != null&&damageteam.equals(blue)){
            damageplayer.teleport(TeamTeleportConfig.BlueLocation());
         }
         BukkitRunnable br = new Game_Invincible(Main.main, 0, damageplayer);
         br.runTaskTimer(Main.main, 0, 20);
         for(Player player : Bukkit.getOnlinePlayers()){
            String target = player.getName();
            Team team = Main.sb.getEntryTeam(target);
            if(team != null&&(team.equals(red)||team.equals(blue))){
               ScoreboardSystem.SetObjective(player);
            }
         }
      }
   }
//サイドバーの設定 クラスはScoreboardSystem
   public static void SetObjective(Player player){
      Scoreboard sb = player.getScoreboard();
      Objective obj = sb.getObjective(ChatColor.GREEN+""+ChatColor.BOLD+"【ゲーム状況】");
      if( obj == null ) {
         obj = sb.registerNewObjective(ChatColor.GREEN+""+ChatColor.BOLD+"【ゲーム状況】", "");
      }
      obj.setDisplaySlot(DisplaySlot.SIDEBAR);
      obj.getScore(ChatColor.YELLOW+""+ChatColor.BOLD+"Coin").setScore(Game_Timer.coin.get(player));
      obj.getScore(ChatColor.RED+""+ChatColor.BOLD+"[赤]残機").setScore(Game_Timer.redpoint);
      obj.getScore(ChatColor.BLUE+""+ChatColor.BOLD+"[青]残機").setScore(Game_Timer.bluepoint);
   }

おかしかったコードが見当たらず、3時間ほどにらめっこし合っても解決してなかったのでどなたか答えを教えてください…
ニコニコ生放送にて生主をしています。
ついでにPluginも作ってます(新米)
アバター
うましゅー
ID:50149204
大工さん
 
記事: 49
登録日時: 2013年3月30日(土) 09:23

  • (PostNo.299791)

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

投稿記事by Silvers_Cat » 2017年4月05日(水) 14:54

プレイヤーの名前を暗証化して、匿名化するプラグインを開発しています。そして以下のような(MITライセンスのソースコードを流用しています)処理を実装しましたが、TABメニュー上では名前が書き換わっていますが、チャット上での名前が書き換わりません。

NameChanger.java
コード: 全て選択
/*
* The MIT License
* Copyright (c) 2015 Techcable
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package com.github.silverscat.theanonymouscraft;

import java.security.MessageDigest;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import org.apache.commons.lang.RandomStringUtils;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
import org.bukkit.scheduler.BukkitRunnable;

import com.comphenix.protocol.PacketType;
import com.comphenix.protocol.ProtocolLibrary;
import com.comphenix.protocol.ProtocolManager;
import com.comphenix.protocol.events.PacketAdapter;
import com.comphenix.protocol.events.PacketEvent;
import com.comphenix.protocol.wrappers.EnumWrappers.PlayerInfoAction;
import com.comphenix.protocol.wrappers.PlayerInfoData;
import com.comphenix.protocol.wrappers.WrappedGameProfile;

public class NameChanger {

   private Map<Player, String> fakeName = new HashMap<Player, String>();
   private final Plugin plugin;

   public NameChanger(Plugin plugin) {

      this.plugin = plugin;

      ProtocolManager protocolManager = ProtocolLibrary.getProtocolManager();
      protocolManager.addPacketListener(new PacketAdapter(this.plugin, PacketType.Play.Server.PLAYER_INFO) {

         @Override
         public void onPacketSending(PacketEvent event) {

            if (PlayerInfoAction.ADD_PLAYER != event.getPacket().getPlayerInfoAction().read(0)) return;

                List<PlayerInfoData> newPlayerInfoDataList = new ArrayList<PlayerInfoData>();
                List<PlayerInfoData> playerInfoDataList = event.getPacket().getPlayerInfoDataLists().read(0);

                for (PlayerInfoData playerInfoData : playerInfoDataList) {
                    if (null == playerInfoData|| null == playerInfoData.getProfile()|| null == Bukkit.getPlayer(playerInfoData.getProfile().getUUID())) {
                        newPlayerInfoDataList.add(playerInfoData);
                        continue;
                    }
                    WrappedGameProfile profile = playerInfoData.getProfile();
                    profile = profile.withName(getName(profile.getUUID()));
                    PlayerInfoData newPlayerInfoData = new PlayerInfoData(profile, playerInfoData.getPing(), playerInfoData.getGameMode(), playerInfoData.getDisplayName());
                    newPlayerInfoDataList.add(newPlayerInfoData);
                }
                event.getPacket().getPlayerInfoDataLists().write(0, newPlayerInfoDataList);

         }

      });
   }

   public String getName(UUID id) {

      Player player = Bukkit.getPlayer(id);

      if (!fakeName.containsKey(player)) setName(player);

      return fakeName.get(player);

   }

   public void setName(Player player) {

      try {

         MessageDigest messageDigest = MessageDigest.getInstance("SHA-512");
         StringBuilder stringBuilder = new StringBuilder();

         String playernameAndSalt = player.getDisplayName() + RandomStringUtils.randomAlphabetic(32);
         messageDigest.update(playernameAndSalt.getBytes());
         for (byte b : messageDigest.digest()) {

            String hex = String.format("%02x", b);
            stringBuilder.append(hex);

         }

         fakeName.put(player, stringBuilder.toString().substring(0, 16));
         refresh(player);

      } catch (Exception ex) {

         ex.printStackTrace();

      }

   }

   public void refresh(Player player) {

        for (final Player forWhom : player.getWorld().getPlayers()) {

            if (player.equals(forWhom) || !player.getWorld().equals(forWhom.getWorld()) || !forWhom.canSee(player)) {

               forWhom.hidePlayer(player);

                new BukkitRunnable() {

                    @Override
                    public void run() {
                        forWhom.showPlayer(player);
                    }

                }.runTaskLater(plugin, 2);

            }
        }

   }

}


サーバー側のログ
コード: 全て選択
[14:48:15 INFO]: UUID of player silvers_caaaaaat is 0107f018-427a-4fc4-9e57-c6cb848e4d92
[14:48:15 WARN]: java.lang.NullPointerException
[14:48:15 WARN]:        at com.github.silverscat.theanonymouscraft.NameChanger.setName(NameChanger.java:100)
[14:48:15 WARN]:        at com.github.silverscat.theanonymouscraft.NameChanger.getName(NameChanger.java:87)
[14:48:15 WARN]:        at com.github.silverscat.theanonymouscraft.TheAnonymousCraft.onLoginPlayer(TheAnonymousCraft.java:30)
[14:48:15 WARN]:        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[14:48:15 WARN]:        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
[14:48:15 WARN]:        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
[14:48:15 WARN]:        at java.lang.reflect.Method.invoke(Unknown Source)
[14:48:15 WARN]:        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:302)
[14:48:15 WARN]:        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62)
[14:48:15 WARN]:        at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:502)
[14:48:15 WARN]:        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:487)
[14:48:15 WARN]:        at net.minecraft.server.v1_10_R1.PlayerList.attemptLogin(PlayerList.java:507)
[14:48:15 WARN]:        at net.minecraft.server.v1_10_R1.LoginListener.b(LoginListener.java:118)
[14:48:15 WARN]:        at net.minecraft.server.v1_10_R1.LoginListener.E_(LoginListener.java:54)
[14:48:15 WARN]:        at net.minecraft.server.v1_10_R1.NetworkManager.a(NetworkManager.java:233)
[14:48:15 WARN]:        at net.minecraft.server.v1_10_R1.ServerConnection.c(ServerConnection.java:140)
[14:48:15 WARN]:        at net.minecraft.server.v1_10_R1.MinecraftServer.D(MinecraftServer.java:827)
[14:48:15 WARN]:        at net.minecraft.server.v1_10_R1.DedicatedServer.D(DedicatedServer.java:400)
[14:48:15 WARN]:        at net.minecraft.server.v1_10_R1.MinecraftServer.C(MinecraftServer.java:668)
[14:48:15 WARN]:        at net.minecraft.server.v1_10_R1.MinecraftServer.run(MinecraftServer.java:567)
[14:48:15 WARN]:        at java.lang.Thread.run(Unknown Source)
[14:48:16 INFO]: silvers_caaaaaat[/127.0.0.1:19469] logged in with entity id 333 at ([world]-205.37054009443145, 69.0, 244.32796369077144)
アバター
Silvers_Cat
ID:ef413e77
石掘り
 
記事: 128
登録日時: 2015年3月29日(日) 12:22
お住まい: Microsoft Windows 10 Pro

  • (PostNo.299883)

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

投稿記事by Lemon18 » 2017年4月06日(木) 10:06

Silvers_Cat さんが書きました:プレイヤーの名前を暗証化して、匿名化するプラグインを開発しています。そして以下のような(MITライセンスのソースコードを流用しています)処理を実装しましたが、TABメニュー上では名前が書き換わっていますが、チャット上での名前が書き換わりません。

NameChanger.java
コード: 全て選択
/*
* The MIT License
* Copyright (c) 2015 Techcable
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package com.github.silverscat.theanonymouscraft;

import java.security.MessageDigest;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import org.apache.commons.lang.RandomStringUtils;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
import org.bukkit.scheduler.BukkitRunnable;

import com.comphenix.protocol.PacketType;
import com.comphenix.protocol.ProtocolLibrary;
import com.comphenix.protocol.ProtocolManager;
import com.comphenix.protocol.events.PacketAdapter;
import com.comphenix.protocol.events.PacketEvent;
import com.comphenix.protocol.wrappers.EnumWrappers.PlayerInfoAction;
import com.comphenix.protocol.wrappers.PlayerInfoData;
import com.comphenix.protocol.wrappers.WrappedGameProfile;

public class NameChanger {

   private Map<Player, String> fakeName = new HashMap<Player, String>();
   private final Plugin plugin;

   public NameChanger(Plugin plugin) {

      this.plugin = plugin;

      ProtocolManager protocolManager = ProtocolLibrary.getProtocolManager();
      protocolManager.addPacketListener(new PacketAdapter(this.plugin, PacketType.Play.Server.PLAYER_INFO) {

         @Override
         public void onPacketSending(PacketEvent event) {

            if (PlayerInfoAction.ADD_PLAYER != event.getPacket().getPlayerInfoAction().read(0)) return;

                List<PlayerInfoData> newPlayerInfoDataList = new ArrayList<PlayerInfoData>();
                List<PlayerInfoData> playerInfoDataList = event.getPacket().getPlayerInfoDataLists().read(0);

                for (PlayerInfoData playerInfoData : playerInfoDataList) {
                    if (null == playerInfoData|| null == playerInfoData.getProfile()|| null == Bukkit.getPlayer(playerInfoData.getProfile().getUUID())) {
                        newPlayerInfoDataList.add(playerInfoData);
                        continue;
                    }
                    WrappedGameProfile profile = playerInfoData.getProfile();
                    profile = profile.withName(getName(profile.getUUID()));
                    PlayerInfoData newPlayerInfoData = new PlayerInfoData(profile, playerInfoData.getPing(), playerInfoData.getGameMode(), playerInfoData.getDisplayName());
                    newPlayerInfoDataList.add(newPlayerInfoData);
                }
                event.getPacket().getPlayerInfoDataLists().write(0, newPlayerInfoDataList);

         }

      });
   }

   public String getName(UUID id) {

      Player player = Bukkit.getPlayer(id);

      if (!fakeName.containsKey(player)) setName(player);

      return fakeName.get(player);

   }

   public void setName(Player player) {

      try {

         MessageDigest messageDigest = MessageDigest.getInstance("SHA-512");
         StringBuilder stringBuilder = new StringBuilder();

         String playernameAndSalt = player.getDisplayName() + RandomStringUtils.randomAlphabetic(32);
         messageDigest.update(playernameAndSalt.getBytes());
         for (byte b : messageDigest.digest()) {

            String hex = String.format("%02x", b);
            stringBuilder.append(hex);

         }

         fakeName.put(player, stringBuilder.toString().substring(0, 16));
         refresh(player);

      } catch (Exception ex) {

         ex.printStackTrace();

      }

   }

   public void refresh(Player player) {

        for (final Player forWhom : player.getWorld().getPlayers()) {

            if (player.equals(forWhom) || !player.getWorld().equals(forWhom.getWorld()) || !forWhom.canSee(player)) {

               forWhom.hidePlayer(player);

                new BukkitRunnable() {

                    @Override
                    public void run() {
                        forWhom.showPlayer(player);
                    }

                }.runTaskLater(plugin, 2);

            }
        }

   }

}


サーバー側のログ
コード: 全て選択
[14:48:15 INFO]: UUID of player silvers_caaaaaat is 0107f018-427a-4fc4-9e57-c6cb848e4d92
[14:48:15 WARN]: java.lang.NullPointerException
[14:48:15 WARN]:        at com.github.silverscat.theanonymouscraft.NameChanger.setName(NameChanger.java:100)
[14:48:15 WARN]:        at com.github.silverscat.theanonymouscraft.NameChanger.getName(NameChanger.java:87)
[14:48:15 WARN]:        at com.github.silverscat.theanonymouscraft.TheAnonymousCraft.onLoginPlayer(TheAnonymousCraft.java:30)
[14:48:15 WARN]:        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[14:48:15 WARN]:        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
[14:48:15 WARN]:        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
[14:48:15 WARN]:        at java.lang.reflect.Method.invoke(Unknown Source)
[14:48:15 WARN]:        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:302)
[14:48:15 WARN]:        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62)
[14:48:15 WARN]:        at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:502)
[14:48:15 WARN]:        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:487)
[14:48:15 WARN]:        at net.minecraft.server.v1_10_R1.PlayerList.attemptLogin(PlayerList.java:507)
[14:48:15 WARN]:        at net.minecraft.server.v1_10_R1.LoginListener.b(LoginListener.java:118)
[14:48:15 WARN]:        at net.minecraft.server.v1_10_R1.LoginListener.E_(LoginListener.java:54)
[14:48:15 WARN]:        at net.minecraft.server.v1_10_R1.NetworkManager.a(NetworkManager.java:233)
[14:48:15 WARN]:        at net.minecraft.server.v1_10_R1.ServerConnection.c(ServerConnection.java:140)
[14:48:15 WARN]:        at net.minecraft.server.v1_10_R1.MinecraftServer.D(MinecraftServer.java:827)
[14:48:15 WARN]:        at net.minecraft.server.v1_10_R1.DedicatedServer.D(DedicatedServer.java:400)
[14:48:15 WARN]:        at net.minecraft.server.v1_10_R1.MinecraftServer.C(MinecraftServer.java:668)
[14:48:15 WARN]:        at net.minecraft.server.v1_10_R1.MinecraftServer.run(MinecraftServer.java:567)
[14:48:15 WARN]:        at java.lang.Thread.run(Unknown Source)
[14:48:16 INFO]: silvers_caaaaaat[/127.0.0.1:19469] logged in with entity id 333 at ([world]-205.37054009443145, 69.0, 244.32796369077144)


見たところ、GameProfileだけ変更されてるみたいなのでチャット上での名前が変わってないのだと思います。
PlayerInfoDataの第4引数を変更すればできるかもしれません。
(NameChanger.javaの100行目でエラー出てますが大丈夫でしょうか)
Bukkitプラグインとか作ったり作らなかったり。
「どのOSでも使える」を目標に日本語入力ツールを作っています。良ければ見てください。
http://forum.minecraftuser.jp/viewtopic.php?f=36&t=31671


Twitter: https://twitter.com/Lemon1806
Minecraft: Applemon
Lemon18
ID:cb27c883
石掘り
 
記事: 84
登録日時: 2015年6月05日(金) 22:42

  • (PostNo.300033)

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

投稿記事by Silvers_Cat » 2017年4月07日(金) 17:54

Lemon18 さんが書きました:見たところ、GameProfileだけ変更されてるみたいなのでチャット上での名前が変わってないのだと思います。
PlayerInfoDataの第4引数を変更すればできるかもしれません。
(NameChanger.javaの100行目でエラー出てますが大丈夫でしょうか)


ごめんなさい!だいぶ遅れてしまいました。その通りにやってみます。
(100行目を見ましたが、特になにも書いていませんでした。)
アバター
Silvers_Cat
ID:ef413e77
石掘り
 
記事: 128
登録日時: 2015年3月29日(日) 12:22
お住まい: Microsoft Windows 10 Pro

  • (PostNo.300090)

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

投稿記事by mame3619 » 2017年4月08日(土) 09:08

また、質問させていただきます。
Interactで、クリックイベントを取得はできたのですが、その時に見ていた離れた場所にあるブロックを取得する方法が分からないのですが、どのようにやればいいのでしょうか?
mame3619
ID:c0514f80
 

  • (PostNo.300199)

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

投稿記事by Lemon18 » 2017年4月09日(日) 17:39

mame3619 さんが書きました:また、質問させていただきます。
Interactで、クリックイベントを取得はできたのですが、その時に見ていた離れた場所にあるブロックを取得する方法が分からないのですが、どのようにやればいいのでしょうか?


LivingEntity#getTargetBlock()
https://hub.spigotmc.org/javadocs/spigot/org/bukkit/entity/LivingEntity.html#getTargetBlock(java.util.Set,%20int)
Bukkitプラグインとか作ったり作らなかったり。
「どのOSでも使える」を目標に日本語入力ツールを作っています。良ければ見てください。
http://forum.minecraftuser.jp/viewtopic.php?f=36&t=31671


Twitter: https://twitter.com/Lemon1806
Minecraft: Applemon
Lemon18
ID:cb27c883
石掘り
 
記事: 84
登録日時: 2015年6月05日(金) 22:42

  • (PostNo.300221)

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

投稿記事by Silvers_Cat » 2017年4月09日(日) 20:06

繰り返しすみません、Lemon18氏の言うとおりに第4引数を以下の通りに変更しましたがやはりうまく行きません。
コード: 全て選択
//試しにTESTにしてみるがうまくいかない
PlayerInfoData newPlayerInfoData = new PlayerInfoData(profile, 5, playerInfoData.getGameMode(), WrappedChatComponent.fromText("TEST"));

WrappedChatComponent.formTextの引数を間違えているのでしょうか?
アバター
Silvers_Cat
ID:ef413e77
石掘り
 
記事: 128
登録日時: 2015年3月29日(日) 12:22
お住まい: Microsoft Windows 10 Pro

1つ前へ次へ

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

x