如何仅单击一次库存项目

时间:2014-07-30 15:41:47

标签: java bukkit

我正在尝试使用胸部库存操作使用Bukkit的Minecraft中的用户GUI,以便我的服务器工作人员可以更好地处理惩罚。我对Java很新,因为我厌倦了现有的插件,因为它们不是我需要的功能。

我已将GUI与InventoryClickEvent挂钩,因此每当玩家点击特定项目时,将从玩家执行特定命令。但是,即使我立即取消事件以防止/ mute命令(示例)不止一次,事件也不会立即取消,因此目标将被静音2-3次(因为工作人员正在点击该项目)

即使事件没有立即取消,有没有办法只执行一次该命令?

以下是代码的主要部分:

/**
 * Applies the punishment when the player clicks on an item.
 * 
 * @param e
 */
@EventHandler
public void ApplyPunishment(InventoryClickEvent e)
{
    if (!e.getInventory().getName().equalsIgnoreCase(gui.getName())) return;
    if (e.getCurrentItem().getItemMeta() == null) return;

    this._player = (Player) e.getWhoClicked();

    if (e.getCurrentItem().getItemMeta().getDisplayName().contains("Modified/Hacked Client"))
    {
        e.setCancelled(true);
        this._player.closeInventory();
        PunishModifiedClient();
    }

    if (e.getCurrentItem().getItemMeta().getDisplayName().contains("Chat Spam/Advertisement"))
    {
        e.setCancelled(true);
        this._player.closeInventory();
        PunishChatSpam();
    }

    if (e.getCurrentItem().getItemMeta().getDisplayName().contains("Bug Exploitation/Glitch"))
    {
        e.setCancelled(true);
        this._player.closeInventory();
        PunishBugExploit();
    }

    if (e.getCurrentItem().getItemMeta().getDisplayName().contains("General/Other Offense"))
    {
        e.setCancelled(true);
        this._player.closeInventory();
        PunishGeneralOffense();
    }

    e.setCancelled(true);
}

/**
 * Modified Client Punishment
 * 
 * Temporary Ban.
 */
public void PunishModifiedClient()
{
    Bukkit.dispatchCommand((CommandSender) _player, "sudo " + _player.getName() + " tempban "+ _target.getName() + " 86400");
    this._player.playSound(this._player.getLocation(), Sound.NOTE_PLING, 1.0F, 1.0F);
}

/**
 * Chat Spam/Advertising
 * 
 * 1 Hour Mute.
 */
public void PunishChatSpam()
{
    Bukkit.dispatchCommand((CommandSender) _player, "mute " + _target.getName() + " 3600");
    this._player.playSound(this._player.getLocation(), Sound.NOTE_PLING, 1.0F, 1.0F);
}

/**
 * Bug Exploitation/Glitch
 * 
 * 3 Hours Ban.
 */
public void PunishBugExploit()
{
    Bukkit.dispatchCommand((CommandSender) _player, "tempban " + _target.getName() + " 10800");
    this._player.playSound(this._player.getLocation(), Sound.NOTE_PLING, 1.0F, 1.0F);
}

/**
 * General/Other offense
 * 
 * 2 Hours Ban.
 */
public void PunishGeneralOffense()
{
    Bukkit.dispatchCommand((CommandSender) _player, "tempban " + _target.getName() + " 7200");
    this._player.playSound(this._player.getLocation(), Sound.NOTE_PLING, 1.0F, 1.0F);
}

1 个答案:

答案 0 :(得分:1)

你可以在惩罚命令中添加一个冷却时间,只让玩家每秒钟进行一次惩罚。这应该可以减少大部分垃圾邮件。查看地图并记录上次玩家受到惩罚的历史记录。如果自从他们受到惩罚以来还没有X秒,那就不要让他们受到惩罚。