0

RuneCraftこれは、パッケージで名前が付けられたメインクラスにありますcom.mcvigor

public static ArrayList<String> prospPlayers = new ArrayList<String>();

MiningListener私はこれを packageという名前の別のクラスに持っていますcom.mcvigor.listeners:

`   public void playerRClickOre(PlayerInteractEvent event) { //Ore Interactions

    final Player p = event.getPlayer();

    if(event.getPlayer().isOp()) return;

    if(RuneCraft.prospPlayers.contains(p.getName())) return;

    if(isClickedBlockMineral(event) && event.getAction() == Action.LEFT_CLICK_BLOCK && !hasPickaxe(p)) { //block is mineral, player left clicked it, no pickaxe
        p.sendMessage(ChatColor.DARK_RED + "You need a pickaxe to mine this."); // ADD CHECKS FOR PICKAXE REQUIRED LEVEL 2 USE
    }

    if(isClickedBlockMineral(event) && event.getAction() == Action.RIGHT_CLICK_BLOCK) {

        switch(event.getClickedBlock().getType()) {

        case CLAY: //clay
            RuneCraft.prospPlayers.add(p.getName());
            p.sendMessage(ChatColor.DARK_RED + "You examine the rock for ores...");
            Bukkit.getScheduler().runTaskLater(plugin, new Runnable(){
                public void run() {
                    p.sendMessage(ChatColor.GRAY + "This rock contains" + ChatColor.DARK_RED + " clay" + ChatColor.GRAY + ".");
                }
            }, 3*20L); // TODO: Change time
            RuneCraft.prospPlayers.remove(p.getName());
            break;`

その下に他のものがありますが、それは重要ではありません。問題は、私が鉱石を探鉱したり調べたりすると、リストに追加されることになっていて、もう一度やろうとすると、探鉱が完了するまで許可されないことです (ArrayList から私の名前が削除されます)。 .

なぜこうなった?

問題はif(RuneCraft.prospPlayers.contains(p.getName())) return;ありますか?

4

1 に答える 1

2

このコードを見てください:

RuneCraft.prospPlayers.add(p.getName());
p.sendMessage(ChatColor.DARK_RED + "You examine the rock for ores...");
Bukkit.getScheduler().runTaskLater(plugin, new Runnable(){
    public void run() {
        p.sendMessage(ChatColor.GRAY + "This rock contains" + ChatColor.DARK_RED + " clay" + ChatColor.GRAY + ".");
    }
}, 3*20L); // TODO: Change time
RuneCraft.prospPlayers.remove(p.getName());

名前を追加して調査を開始したと言った直後に、名前を再度削除しています。調べ終わってから削除したいだけですよね?removeしたがって、「後のタスク」が実行されたときに呼び出しが発生するように移動する必要があります。

RuneCraft.prospPlayers.add(p.getName());
p.sendMessage(ChatColor.DARK_RED + "You examine the rock for ores...");
Bukkit.getScheduler().runTaskLater(plugin, new Runnable() {
    public void run() {
        p.sendMessage(ChatColor.GRAY + "This rock contains" + 
                      ChatColor.DARK_RED + " clay" + ChatColor.GRAY + ".");
        RuneCraft.prospPlayers.remove(p.getName());
    }
}, 3*20L); // TODO: Change time

確かに、とにかくこれに静的変数を使用することは避けたいと思いますが、それは別の問題です。

于 2013-06-22T11:19:50.700 に答える