我想制作一个类似于 AuthMe 的插件,阻止所有操作——放置/破坏块、更改库存、聊天——当玩家刚刚加入时,直到他使用命令登录。
我不想使用 AuthMe 的原因是因为我希望它与我的网站进行通信,例如使用与网站上的帐户相同的密码。
创建一个Listener
监听所有要取消的事件。
查看下的不同包org.bukkit.event
。您可能需要参与大多数org.bukkit.event.player
事件。
我建议您看一下AuthMe Reloaded源代码,以了解它是如何做到的。检查fr.xephi.authme.listener
包裹。
我可以为您提供一些代码来执行此操作,因为我自己编写了 AuthMC 副本。
首先,您需要列出需要取消的事件。然后,您将需要一个“已登录”玩家的 HashSet。每个事件侦听器都会检查玩家是否在 HashSet 中,如果不在则取消事件。
HashSet<String> loggedInPlayers = new HashSet<String>();
public void blockBreak(BlockBreakEvent e) {
if(!logginInPlayers.contains(e.getPlayer().getName()) {
e.setCancelled(true);
}
}
请注意,HashSet 应包含玩家姓名。这是为了节省内存,因为您应该知道直接存储播放器会占用大量内存。
您还需要一个事件侦听器,用于在玩家注销时将其从 HashSet 中移除。
public void playerQuit(PlayerQuitEvent e) {
loggedInPlayers.remove(e.getPlayer().getName();
}
正如人们之前所说,您所要做的就是监听事件的发生并检查它们是否在指定的列表中。不一定是 List,HashMap 也可以。正如建议的那样,HashSet 也是如此。但是,让它连接到您的网站会有点困难,我无法回答如何做到这一点,因为我对此主题一无所知。
当玩家聊天时取消事件的示例(我在自己的插件中使用它,并使用 HashSet 来判断玩家是否登录):
HashSet<String> loggedIn = new HashSet<String>();
@EventHandler
public void onPlayerChat(PlayerChatEvent event) {
if (!loggedIn.contains(event.getPlayer().getName()) {
event.setCancelled(true);
event.getPlayer().sendMessage("You must log in to chat!"); //Optional
}
}
您还需要一些东西来将他们从退出时登录的玩家列表中删除:
@EventHandler
public void onPlayerQuit(PlayerQuitEvent event) {
loggedIn.remove(event.getPlayer().getName());
}
只需重复我为其他事件提供的聊天示例,就可以了!