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

Modding・サーバPlugin制作・ツール制作など、開発関連の質問があればこちらにお願い致します。
フォーラムルール
質問関連フォーラムで質問する時は、必ず次のトピックを一読/厳守お願い致します。
viewtopic.php?f=5&t=999
  • (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
水から上がったとこ
 
記事: 9
登録日時: 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
木を殴ってる
 
記事: 37
登録日時: 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
ダイヤモンド掘り
 
記事: 823
登録日時: 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
水から上がったとこ
 
記事: 9
登録日時: 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
ダイヤモンド掘り
 
記事: 823
登録日時: 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
石掘り
 
記事: 129
登録日時: 2015年3月29日(日) 12:22

  • (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行目でエラー出てますが大丈夫でしょうか)
:D
Lemon18
ID:cb27c883
石掘り
 
記事: 85
登録日時: 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
石掘り
 
記事: 129
登録日時: 2015年3月29日(日) 12:22

  • (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)
:D
Lemon18
ID:cb27c883
石掘り
 
記事: 85
登録日時: 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
石掘り
 
記事: 129
登録日時: 2015年3月29日(日) 12:22

  • (PostNo.300310)

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

投稿記事by Lemon18 » 2017年4月11日(火) 11:53

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

WrappedChatComponent.formTextの引数を間違えているのでしょうか?


私の方でも試してみましたが、同じ結果でした。そこは関係なかったみたいです、ごめんなさい。
:D
Lemon18
ID:cb27c883
石掘り
 
記事: 85
登録日時: 2015年6月05日(金) 22:42

  • (PostNo.300988)

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

投稿記事by オリゼリ » 2017年4月23日(日) 02:05

プレイヤーごとのループ文の作り方を教えてください

多分これだとサーバー全体のループだと思います
コード: 全て選択
                        BukkitScheduler scheduler; = Bukkit.getServer().getScheduler();
                        task = scheduler.scheduleSyncRepeatingTask(this, new Runnable() {
                            @Override
                            public void run() {
                             //code
                             }
                        }, 0L, 1L);

質問の仕方とか直したほうがいいよってことがあったら教えていただければ嬉しいです
オリゼリ
ID:fc835bc3
大工さん
 
記事: 45
登録日時: 2015年4月29日(水) 20:13

  • (PostNo.300994)

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

投稿記事by amata1219 » 2017年4月23日(日) 08:30

オリゼリ さんが書きました:プレイヤーごとのループ文の作り方を教えてください

多分これだとサーバー全体のループだと思います
コード: 全て選択
                        BukkitScheduler scheduler; = Bukkit.getServer().getScheduler();
                        task = scheduler.scheduleSyncRepeatingTask(this, new Runnable() {
                            @Override
                            public void run() {
                             //code
                             }
                        }, 0L, 1L);


オリゼリさん、こんにちは。

対象のプレイヤーの状態が不明ですので、ここではオンラインプレイヤーと仮定して説明しますね。
答えは非常に単純明快で、下記コードを参考にしてみてくださいね。
コード: 全て選択
for(Player p : plugin.getServer().getOnlinePlayers()){
         //ここにプレイヤー単位の処理内容を実装
      }

サーバーから全オンラインプレイヤーを取得しプレイヤー単位に分けることで、お望みの動作が実現出来ますよ。

1tick毎に処理を実行する状態になっているようですが大丈夫でしょうか…?
1秒は20tickですので、現在の状態で下手に重い処理でも実装すると、サーバーが落ちる可能性があります。
アバター
amata1219
ID:e1938bc3
木を殴ってる
 
記事: 37
登録日時: 2016年11月18日(金) 16:46

  • (PostNo.301034)

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

投稿記事by オリゼリ » 2017年4月23日(日) 17:24

amata1219 さんが書きました:
オリゼリ さんが書きました:プレイヤーごとのループ文の作り方を教えてください

多分これだとサーバー全体のループだと思います
コード: 全て選択
                        BukkitScheduler scheduler; = Bukkit.getServer().getScheduler();
                        task = scheduler.scheduleSyncRepeatingTask(this, new Runnable() {
                            @Override
                            public void run() {
                             //code
                             }
                        }, 0L, 1L);


オリゼリさん、こんにちは。

対象のプレイヤーの状態が不明ですので、ここではオンラインプレイヤーと仮定して説明しますね。
答えは非常に単純明快で、下記コードを参考にしてみてくださいね。
コード: 全て選択
for(Player p : plugin.getServer().getOnlinePlayers()){
         //ここにプレイヤー単位の処理内容を実装
      }

サーバーから全オンラインプレイヤーを取得しプレイヤー単位に分けることで、お望みの動作が実現出来ますよ。

[spoiler]1tick毎に処理を実行する状態になっているようですが大丈夫でしょうか…?
1秒は20tickですので、現在の状態で下手に重い処理でも実装すると、サーバーが落ちる可能性があります。
[/spoiler]

すみませんコードはります
一部抜いて変更してありますがプラグインとしてはコマンドを打ったプレイヤーにアクションバーに文字を連続的に出すプラグインです
なのでプレイヤーごとにループさせプレイヤーごとに止めれるようにしたいのです
まだ説明不足のようでしたら教えてください
1tickなのは大丈夫です
コード: 全て選択
    public boolean onCommand(CommandSender sender, Command command, String c, String[] args) {
        Player player = (Player) sender;
        if (command.getName().equalsIgnoreCase("aaa")) {
            if (sender instanceof Player) {
                if (args.length == 0) {
                        scheduler = Bukkit.getServer().getScheduler();
                        task = scheduler.scheduleSyncRepeatingTask(this, new Runnable() {
        //code
                           sendChatAtionBar(player, aaa);
                        }, 0L, 1L);
                    return true;
                }
            }
        }
        return false;
    }
質問の仕方とか直したほうがいいよってことがあったら教えていただければ嬉しいです
オリゼリ
ID:fc835bc3
大工さん
 
記事: 45
登録日時: 2015年4月29日(水) 20:13

  • (PostNo.301130)

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

投稿記事by レイトン » 2017年4月25日(火) 09:36

質問なのですが
プレイヤーのレベルアップまでに必要な
経験値量をこっちでいじることって
bukkitにおいて可能なのでしょうか
レイトン
ID:bd787e33
 

  • (PostNo.301211)

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

投稿記事by amata1219 » 2017年4月27日(木) 07:05

オリゼリ さんが書きました:
amata1219 さんが書きました:
オリゼリ さんが書きました:プレイヤーごとのループ文の作り方を教えてください

多分これだとサーバー全体のループだと思います
コード: 全て選択
                        BukkitScheduler scheduler; = Bukkit.getServer().getScheduler();
                        task = scheduler.scheduleSyncRepeatingTask(this, new Runnable() {
                            @Override
                            public void run() {
                             //code
                             }
                        }, 0L, 1L);


オリゼリさん、こんにちは。

対象のプレイヤーの状態が不明ですので、ここではオンラインプレイヤーと仮定して説明しますね。
答えは非常に単純明快で、下記コードを参考にしてみてくださいね。
コード: 全て選択
for(Player p : plugin.getServer().getOnlinePlayers()){
         //ここにプレイヤー単位の処理内容を実装
      }

サーバーから全オンラインプレイヤーを取得しプレイヤー単位に分けることで、お望みの動作が実現出来ますよ。

[spoiler]1tick毎に処理を実行する状態になっているようですが大丈夫でしょうか…?
1秒は20tickですので、現在の状態で下手に重い処理でも実装すると、サーバーが落ちる可能性があります。
[/spoiler]

すみませんコードはります
一部抜いて変更してありますがプラグインとしてはコマンドを打ったプレイヤーにアクションバーに文字を連続的に出すプラグインです
なのでプレイヤーごとにループさせプレイヤーごとに止めれるようにしたいのです
まだ説明不足のようでしたら教えてください
1tickなのは大丈夫です
コード: 全て選択
    public boolean onCommand(CommandSender sender, Command command, String c, String[] args) {
        Player player = (Player) sender;
        if (command.getName().equalsIgnoreCase("aaa")) {
            if (sender instanceof Player) {
                if (args.length == 0) {
                        scheduler = Bukkit.getServer().getScheduler();
                        task = scheduler.scheduleSyncRepeatingTask(this, new Runnable() {
        //code
                           sendChatAtionBar(player, aaa);
                        }, 0L, 1L);
                    return true;
                }
            }
        }
        return false;
    }


オリゼリさん、こんにちは。
何回を目安に処理を終了するのかは分かりませんが、スケジューラの処理内容に先日のfor分を組み込めば実装可能です。
コード: 全て選択
    public boolean onCommand(CommandSender sender, Command command, String c, String[] args) {
        Player player = (Player) sender;
        int i = 0;
        if (command.getName().equalsIgnoreCase("aaa")) {
            if (sender instanceof Player) {
                if (args.length == 0) {
                        scheduler = Bukkit.getServer().getScheduler();
                        task = scheduler.scheduleSyncRepeatingTask(this, new Runnable() {
                          i++;
                          if(i > 5){
                              task.cancel();
                         }
        for(Player p : plugin.getServer().getOnlinePlayers()){
         //ここにプレイヤー単位の処理内容を実装
                               }
                        }, 0L, 1L);
                    return true;
                }
            }
        }
アバター
amata1219
ID:e1938bc3
木を殴ってる
 
記事: 37
登録日時: 2016年11月18日(金) 16:46

  • (PostNo.301213)

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

投稿記事by amata1219 » 2017年4月27日(木) 07:16

レイトン さんが書きました:質問なのですが
プレイヤーのレベルアップまでに必要な
経験値量をこっちでいじることって
bukkitにおいて可能なのでしょうか


レイトンさん、こんにちは。
恐らく不可能です。ただ、一定の経験値量を超えた場合に強制的に経験値量を増加させることで、擬似的にそういったシステムを作り出すことは可能です。
アバター
amata1219
ID:e1938bc3
木を殴ってる
 
記事: 37
登録日時: 2016年11月18日(金) 16:46

1つ前へ次へ

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

x