2016-06-16 17 views
0

私はこのプラグインを開発していますので、その機能について説明します。
-/showcps:送信者は、指定されたプレイヤーは、右のは、このプラグインを実行しているサーバー上の2人のプレーヤー、ボブおよびビリーがあるとしましょう、Bukkit - 問題の原因となる静的変数の使用

ので、クリック/左たび; Bobはコマンド/showcps Billyを実行し、Billyがクリックするたびに表示します。その後、Billyはコマンド​​を入力し、BobがクリックするとBillyが表示します。問題は、BillyがクリックしているときにBobがもう見ることができないことです。

私の問題です。私はなぜそれが起こるか知っていると思うが、私はそれを修正する方法がわからない。私は、クリックリスナーとコマンド実行クラスの間でそれらを交換可能に使用できるように、グローバル変数を使用しました。

ここではリスナーのためのコードです:ここで

@ 
EventHandler 
public void leftClick(PlayerInteractEvent event) { 
    Player player = event.getPlayer(); 

    if (event.getAction().equals(Action.LEFT_CLICK_AIR) | event.getAction().equals(Action.LEFT_CLICK_BLOCK)) { 
    if (player.equals(ClickViewToggle.targetPlayer)) { 
     ClickViewToggle.recivingPlayer.sendMessage(
     ChatColor.LIGHT_PURPLE + player.getName() + ChatColor.DARK_PURPLE + " left clicked."); 
    } 
    } 
} 

@ 
EventHandler 
public void rightClick(PlayerInteractEvent event) { 
    Player player = event.getPlayer(); 

    if (event.getAction().equals(Action.RIGHT_CLICK_AIR) | event.getAction().equals(Action.RIGHT_CLICK_BLOCK)) { 
    if (player.equals(ClickViewToggle.targetPlayer)) { 
     ClickViewToggle.recivingPlayer.sendMessage(
     ChatColor.LIGHT_PURPLE + player.getName() + ChatColor.DARK_PURPLE + " right clicked."); 
    } 
    } 
} 

は、コマンド実行のためのコードです:

public static Player targetPlayer = null; 
public static Player recivingPlayer; 

public boolean onCommand(CommandSender sender, Command command, String cmd, String[] args) { 
    recivingPlayer = (Player) sender; 
    if (args[0].isEmpty()) { 
    if (sender instanceof Player) { 
     sender.sendMessage(ChatColor.DARK_PURPLE + "You will now be able to see your clicks."); 
     targetPlayer = (Player) sender; 
     return false; 
    } else { 
     sender.sendMessage(ChatColor.DARK_PURPLE + "You must specify a player."); 
     return false; 
    } 
    } else { 
    boolean playerFound = false; 
    for (Player player: Bukkit.getServer().getOnlinePlayers()) { 
     if (player.getName().equalsIgnoreCase(args[0])) { 
     sender.sendMessage(ChatColor.DARK_PURPLE + "You are now seeing " + ChatColor.LIGHT_PURPLE + player.getName() + ChatColor.DARK_PURPLE + "\'s clicks."); 
     targetPlayer = player; 
     playerFound = true; 
     break; 
     } 
    } 
    if (!playerFound) { 
     sender.sendMessage(ChatColor.DARK_PURPLE + "Couldn't find " + ChatColor.LIGHT_PURPLE + args[0] + ChatColor.DARK_PURPLE + "."); 
     targetPlayer = null; 
    } 
    return false; 
    } 
} 

あなたが見ることができるように、receivingPlayertargetPlayerは、二つのクラスの間で使用されているが、私は、それは彼らが両方同時に異なるクリックを見ることができない理由のように感じる。

どうすればこの問題を解決できますか?

答えて

0

このコードは深刻な問題を持っているので、私は、Bukkitにダイビング前のjavaを学ぶためにあなたをお勧めします。

変数が受信者プレーヤーと送信プレーヤーを格納するために問題が発生します。この方法で、あなたがそれを変更すると、古い受信プレーヤーは新しいメッセージを取得しません。送信プレイヤーのUUIDをキーに、受信プレイヤーのUUIDを値としてハッシュマップを使用すると、プレーヤーがマップ内にあるときに、対応する受信者にメッセージを送信します。 yoirコードで

その他の問題:

静的を乱用しないでください、それは悪い習慣、使用ゲッターとセッターです。

は、あなたがあなたのプラグインでイベントタイプについてのみ1のEventHandlerを持つべきである代わりに.equal

の==と列挙型を比較してください。

フルプレイヤオブジェクトを保存しないでくださいあなたは十分注意しないなら、彼らは、メモリリークが発生タクシー。

args[0].isEmpty()は、引数が指定されていない場合、args [0]がemoty文字列と等しい場合のみ、エラーをスローします。

これらはhttp://bukkit.orgフォーラムで、我々は時間の90%に遭遇した問題と同じ種類です。 Bukkitベースの質問には、そのフォーラムを使用して、人々はより多くのことを助けることができます。

+0

私は完全にセッターとゲッターを見落として、ありがとうございます。私はちょうど自分自身をより良く笑うようにするためにいくつかの事を暴露するつもりです。私はまともな量のJavaを学んだ、私は何かの前にJavaを学んだ。それはいくつかを慣れてきたbukkitされています。まず、 '.equal'を使うべきではないのですか?あなたはこのトピックの投稿に私を向けることができますか?また、何らかの理由でbukkitが 'RIGHT_CLICK_AIR'を好きではないので、私はそのクラスに2つのイベントハンドラを持っていました。私は別のイベントハンドラでそれを修正しようと考えました。:P – Kaelinator

+0

**フルプレーヤーオブジェクトを絶対に保存しないと言ったら**どういう意味ですか?そして、 'args [0] .isEmpty()'は私にエラーを与えていましたが、私が最初に気づいた問題を解決することに焦点を当てていました。私のコードは悪く見えますが、私が通常行っていることは、プログラムをコード化し、それが動作することを確認して、可読性、安定性、パフォーマンスのために最適化して最適化することです。しかし、ええ、もう一度ありがとう! – Kaelinator

+0

@Kaelinator列挙型はシングルトンですが、より高速な==を使用することができます。ただし、これは他のオブジェクトでは同じではありません。 Bukkitはright_click_airの問題を抱えています。そんなことはありません。すぐに制御が外れ、後で正しく最適化することはできません。 –

関連する問題