私はこのプラグインを開発していますので、その機能について説明します。
-/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;
}
}
あなたが見ることができるように、receivingPlayer
とtargetPlayer
は、二つのクラスの間で使用されているが、私は、それは彼らが両方同時に異なるクリックを見ることができない理由のように感じる。
どうすればこの問題を解決できますか?
私は完全にセッターとゲッターを見落として、ありがとうございます。私はちょうど自分自身をより良く笑うようにするためにいくつかの事を暴露するつもりです。私はまともな量のJavaを学んだ、私は何かの前にJavaを学んだ。それはいくつかを慣れてきたbukkitされています。まず、 '.equal'を使うべきではないのですか?あなたはこのトピックの投稿に私を向けることができますか?また、何らかの理由でbukkitが 'RIGHT_CLICK_AIR'を好きではないので、私はそのクラスに2つのイベントハンドラを持っていました。私は別のイベントハンドラでそれを修正しようと考えました。:P – Kaelinator
**フルプレーヤーオブジェクトを絶対に保存しないと言ったら**どういう意味ですか?そして、 'args [0] .isEmpty()'は私にエラーを与えていましたが、私が最初に気づいた問題を解決することに焦点を当てていました。私のコードは悪く見えますが、私が通常行っていることは、プログラムをコード化し、それが動作することを確認して、可読性、安定性、パフォーマンスのために最適化して最適化することです。しかし、ええ、もう一度ありがとう! – Kaelinator
@Kaelinator列挙型はシングルトンですが、より高速な==を使用することができます。ただし、これは他のオブジェクトでは同じではありません。 Bukkitはright_click_airの問題を抱えています。そんなことはありません。すぐに制御が外れ、後で正しく最適化することはできません。 –