0

我想制作一个类似于 AuthMe 的插件,阻止所有操作——放置/破坏块、更改库存、聊天——当玩家刚刚加入时,直到他使用命令登录。

我不想使用 AuthMe 的原因是因为我希望它与我的网站进行通信,例如使用与网站上的帐户相同的密码。

4

3 回答 3

7

创建一个Listener监听所有要取消的事件。

查看下的不同包org.bukkit.event。您可能需要参与大多数org.bukkit.event.player事件。

我建议您看一下AuthMe Reloaded源代码,以了解它是如何做到的。检查fr.xephi.authme.listener包裹。

于 2012-09-01T16:06:47.537 回答
1

我可以为您提供一些代码来执行此操作,因为我自己编写了 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();
}
于 2012-09-09T17:36:40.993 回答
1

正如人们之前所说,您所要做的就是监听事件的发生并检查它们是否在指定的列表中。不一定是 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());
}

只需重复我为其他事件提供的聊天示例,就可以了!

于 2012-11-30T15:09:15.283 回答