我正在尝试使用胸部库存操作使用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);
}
答案 0 :(得分:1)
你可以在惩罚命令中添加一个冷却时间,只让玩家每秒钟进行一次惩罚。这应该可以减少大部分垃圾邮件。查看地图并记录上次玩家受到惩罚的历史记录。如果自从他们受到惩罚以来还没有X秒,那就不要让他们受到惩罚。