player.sendMessage отправляет дважды - PullRequest
0 голосов
/ 27 января 2019

После щелчка правой кнопкой мыши по шрумсу, он говорит: «Вы потребляли шрум», затем, после повторной попытки, он говорит: «Не передозировка, дети», но если употреблять сахар, он говорит вам: «Вы нюхали кокаин», «Не передозировка,дети "мгновенно.В чем проблема?

Я пробовал отдельные классы, также когда выполнял sendMessage, щелкнув по нему правой кнопкой мыши, дважды щелкнув правой кнопкой мыши при потреблении сахара.

Класс событий

package com.maverick.drugPlugin.Events;

import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;


public class EventsClass implements Listener {
    @EventHandler
    @SuppressWarnings({ "deprecation" })
    public void consumeDrugs(PlayerInteractEvent event) {
        Player player = event.getPlayer();
        Action action = event.getAction();

        if(action.equals(Action.RIGHT_CLICK_AIR) || action.equals(Action.RIGHT_CLICK_BLOCK)) {
            if (player.getItemInHand().getType() == Material.BROWN_MUSHROOM) {
                if(!player.hasPotionEffect(PotionEffectType.CONFUSION)) {
                player.getInventory().getItemInHand().setAmount(player.getInventory().getItemInHand().getAmount() - 1);
                player.sendMessage(ChatColor.RED + "You consumed " + ChatColor.BLUE + "shrooms");
                player.addPotionEffect(new PotionEffect(PotionEffectType.CONFUSION, 120*20, 1, true, false));
                } else {
                player.sendMessage(ChatColor.DARK_RED + "Don't overdose, kids");
            }
    }
}
        if(action.equals(Action.RIGHT_CLICK_AIR) || action.equals(Action.RIGHT_CLICK_BLOCK)) {
            if (player.getItemInHand().getType() == Material.SUGAR) {
                if(!player.hasPotionEffect(PotionEffectType.CONFUSION)) {
                player.getInventory().getItemInHand().setAmount(player.getInventory().getItemInHand().getAmount() - 1);
                player.sendMessage(ChatColor.RED + "You snorted " + ChatColor.BLUE + "cocaine");
                player.addPotionEffect(new PotionEffect(PotionEffectType.CONFUSION, 120*20, 1, true, false));
                } else {
                player.sendMessage(ChatColor.DARK_RED + "Don't overdose, kids");
                }

            }
        }
    }
}
package com.maverick.drugPlugin;

import org.bukkit.plugin.java.JavaPlugin;

import com.maverick.drugPlugin.Events.EventsClass;

import org.bukkit.ChatColor;

public class Drugs extends JavaPlugin {

    public void onEnable() {
        getServer().getPluginManager().registerEvents(new EventsClass(), this);
        getServer().getConsoleSender().sendMessage(ChatColor.GREEN + "\n\nDrugs are enabled\n\n");
    }

    public void onDisable() {
        getServer().getConsoleSender().sendMessage(ChatColor.RED + "\n\nDrugs are Disabled\n\n");
    }
}

Я хочу, чтобы при потреблении сахара (кокаина) сначала говорилось: «Вы нюхали кокаин», а затем, пытаясь снова его употребить, говорилось бы: «Не передозируй, дети», как на грибах.

1 Ответ

0 голосов
/ 01 февраля 2019

Событие PlayerInteract может быть немного темпераментным и иногда срабатывать один, два или даже несколько раз.В подобных случаях решение, которое я использовал в прошлом, состояло в том, чтобы использовать Map<UUID, Long> для хранения текущей отметки времени System.currentTimeMillis(), когда игрок вызвал событие взаимодействия.

Затем с небольшим тестированием и в зависимости ото вашем поведении, если последующие события взаимодействия происходят в течение короткого временного окна, скажем, 100-200 мс, тогда вы можете просто отменить их, и это решит проблему двойного щелчка.

...