Skip to content

Commit

Permalink
feat: 优化了玩家事件处理逻辑
Browse files Browse the repository at this point in the history
  • Loading branch information
shulng committed Jul 31, 2024
1 parent ae07e78 commit c0f21c9
Showing 1 changed file with 44 additions and 72 deletions.
116 changes: 44 additions & 72 deletions src/main/java/cc/baka9/catseedlogin/bukkit/Listeners.java
Original file line number Diff line number Diff line change
Expand Up @@ -37,14 +37,13 @@ private boolean playerIsNotMinecraftPlayer(Player p) {

@EventHandler
public void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent event) {
if (playerIsNotMinecraftPlayer(event.getPlayer())) return;
if (LoginPlayerHelper.isLogin(event.getPlayer().getName())) return;
Player player = event.getPlayer();
if (playerIsNotMinecraftPlayer(player) || LoginPlayerHelper.isLogin(player.getName())) return;
String input = event.getMessage().toLowerCase();
for (Pattern regex : Config.Settings.CommandWhiteList) {
if (regex.matcher(input).find()) return;
}
event.setCancelled(true);

}

@EventHandler
Expand All @@ -62,34 +61,28 @@ public void onPlayerLogin(AsyncPlayerPreLoginEvent event) {
}
if (LoginPlayerHelper.isLogin(name)) {
event.disallow(AsyncPlayerPreLoginEvent.Result.KICK_OTHER, "玩家 " + lp.getName() + " 已经在线了!");
return;
}
int count = 0;
String hostAddress = event.getAddress().getHostAddress();
for (Player p : Bukkit.getOnlinePlayers()) {
String ip = p.getAddress().getAddress().getHostAddress();
if (ip.equals(hostAddress)) {
count++;
}
if (count >= Config.Settings.IpCountLimit) {
event.disallow(AsyncPlayerPreLoginEvent.Result.KICK_OTHER, "太多相同ip的账号同时在线!");
return;
}
long count = Bukkit.getOnlinePlayers().stream()
.filter(p -> p.getAddress().getAddress().getHostAddress().equals(hostAddress))
.count();
if (count >= Config.Settings.IpCountLimit) {
event.disallow(AsyncPlayerPreLoginEvent.Result.KICK_OTHER, "太多相同ip的账号同时在线!");
}


}

@EventHandler
public void onPlayerChat(AsyncPlayerChatEvent event) {
if (playerIsNotMinecraftPlayer(event.getPlayer())) return;
if (LoginPlayerHelper.isLogin(event.getPlayer().getName())) return;
Player player = event.getPlayer();
if (playerIsNotMinecraftPlayer(player) || LoginPlayerHelper.isLogin(player.getName())) return;
event.setCancelled(true);
}

@EventHandler
public void onPlayerInteract(PlayerInteractEvent event) {
if (playerIsNotMinecraftPlayer(event.getPlayer())) return;
if (LoginPlayerHelper.isLogin(event.getPlayer().getName())) return;
Player player = event.getPlayer();
if (playerIsNotMinecraftPlayer(player) || LoginPlayerHelper.isLogin(player.getName())) return;
event.setCancelled(true);
}

Expand All @@ -101,78 +94,67 @@ public void onInventoryOpen(InventoryOpenEvent event) {

@EventHandler
public void onInventoryClick(InventoryClickEvent event) {
if (!(event.getWhoClicked() instanceof Player) || LoginPlayerHelper.isLogin(event.getWhoClicked().getName()))
return;
if (!(event.getWhoClicked() instanceof Player) || LoginPlayerHelper.isLogin(event.getWhoClicked().getName())) return;
event.setCancelled(true);
}

//登陆之前不能攻击
@EventHandler
public void onEntityDamageByEntity(EntityDamageByEntityEvent event) {
if (!(event.getDamager() instanceof Player)) return;
if (playerIsNotMinecraftPlayer((Player) event.getDamager())) return;
if (LoginPlayerHelper.isLogin(event.getDamager().getName())) return;
Player player = (Player) event.getDamager();
if (playerIsNotMinecraftPlayer(player) || LoginPlayerHelper.isLogin(player.getName())) return;
event.setCancelled(true);
}

//登陆之前不会受到伤害
@EventHandler
public void onEntityDamage(EntityDamageEvent event) {
if (Config.Settings.BeforeLoginNoDamage) {

Entity entity = event.getEntity();
if (entity instanceof Player && !playerIsNotMinecraftPlayer((Player) entity)) {
if (!LoginPlayerHelper.isLogin(entity.getName())) {
event.setCancelled(true);
}

if (entity instanceof Player && !playerIsNotMinecraftPlayer((Player) entity) && !LoginPlayerHelper.isLogin(entity.getName())) {
event.setCancelled(true);
}

}

}

@EventHandler
public void onPlayerTeleport(PlayerTeleportEvent event) {
if (Config.Settings.CanTpSpawnLocation && event.getTo().equals(Config.Settings.SpawnLocation)) return;
if (playerIsNotMinecraftPlayer(event.getPlayer())) return;
if (LoginPlayerHelper.isLogin(event.getPlayer().getName())) return;
Player player = event.getPlayer();
if ((Config.Settings.CanTpSpawnLocation && event.getTo().equals(Config.Settings.SpawnLocation)) ||
playerIsNotMinecraftPlayer(player) || LoginPlayerHelper.isLogin(player.getName())) return;
event.setCancelled(true);
}

@EventHandler
public void onPlayerDropItem(PlayerDropItemEvent event) {
if (playerIsNotMinecraftPlayer(event.getPlayer())) return;
if (LoginPlayerHelper.isLogin(event.getPlayer().getName())) return;
Player player = event.getPlayer();
if (playerIsNotMinecraftPlayer(player) || LoginPlayerHelper.isLogin(player.getName())) return;
event.setCancelled(true);
}

@EventHandler
public void onEntityPickupItem(EntityPickupItemEvent event) {
if (!(event.getEntity() instanceof Player)) return;
Player player = (Player) event.getEntity();
if (playerIsNotMinecraftPlayer(player)) return;
if (LoginPlayerHelper.isLogin(player.getName())) return;
if (playerIsNotMinecraftPlayer(player) || LoginPlayerHelper.isLogin(player.getName())) return;
event.setCancelled(true);
}

@EventHandler
public void onPlayerMove(PlayerMoveEvent event) {
Player player = event.getPlayer();
if (playerIsNotMinecraftPlayer(player)) return;
if (LoginPlayerHelper.isLogin(player.getName())) return;
if (playerIsNotMinecraftPlayer(player) || LoginPlayerHelper.isLogin(player.getName())) return;
Location from = event.getFrom();
Location to = event.getTo();
if (from.getBlockX() == to.getBlockX() && from.getBlockZ() == to.getBlockZ() && from.getY() - to.getY() >= 0.0D) {
return;
}

if (Config.Settings.CanTpSpawnLocation) {
CatScheduler.teleport(player,Config.Settings.SpawnLocation);
CatScheduler.teleport(player, Config.Settings.SpawnLocation);
} else {
event.setCancelled(true);
}

}

@EventHandler
Expand All @@ -185,54 +167,44 @@ public void onPlayerQuit(PlayerQuitEvent event) {
CatScheduler.runTaskLater(() -> LoginPlayerHelper.remove(player.getName()), Config.Settings.ReenterInterval);
}
Task.getTaskAutoKick().playerJoinTime.remove(player.getName());

}

@EventHandler
public void onPlayerJoin(PlayerJoinEvent event) {
Player p = event.getPlayer();
if (Config.Settings.BedrockLoginBypass && LoginPlayerHelper.isFloodgatePlayer(p)) {
p.sendMessage(Config.Language.BEDROCK_LOGIN_BYPASS);
Player player = event.getPlayer();
if (Config.Settings.BedrockLoginBypass && LoginPlayerHelper.isFloodgatePlayer(player)) {
player.sendMessage(Config.Language.BEDROCK_LOGIN_BYPASS);
return;
}
if (Config.Settings.LoginwiththesameIP && LoginPlayerHelper.recordCurrentIP(p)) {
p.sendMessage(Config.Language.LOGIN_WITH_THE_SAME_IP);
if (Config.Settings.LoginwiththesameIP && LoginPlayerHelper.recordCurrentIP(player)) {
player.sendMessage(Config.Language.LOGIN_WITH_THE_SAME_IP);
return;
}
Cache.refresh(p.getName());
Cache.refresh(player.getName());
if (Config.Settings.CanTpSpawnLocation) {
CatScheduler.teleport(p,Config.Settings.SpawnLocation);
CatScheduler.teleport(player, Config.Settings.SpawnLocation);
}
}

//id只能下划线字母数字
@EventHandler
public void onPlayerPreLogin(AsyncPlayerPreLoginEvent event) {
String name = event.getName();
if (Config.Settings.LimitChineseID) {
if (!name.matches("^\\w+$")) {
event.disallow(AsyncPlayerPreLoginEvent.Result.KICK_OTHER,
"请使用由数字,字母和下划线组成的游戏名,才能进入游戏");
}
if (Config.Settings.LimitChineseID && !name.matches("^\\w+$")) {
event.disallow(AsyncPlayerPreLoginEvent.Result.KICK_OTHER, "请使用由数字,字母和下划线组成的游戏名,才能进入游戏");
return;
}
if (Config.Settings.FloodgatePrefixProtect && Bukkit.getPluginManager().getPlugin("floodgate") != null) {
if (Config.Settings.BedrockLoginBypass && Bukkit.getPluginManager().getPlugin("floodgate") != null) {
String prefix = FloodgateApi.getInstance().getPlayerPrefix();
if (event.getName().startsWith(prefix) && !FloodgateApi.getInstance().isFloodgatePlayer(event.getUniqueId())) {
event.disallow(AsyncPlayerPreLoginEvent.Result.KICK_OTHER,
"非法的基岩版玩家名称,请非基岩版玩家的名称不要以" + prefix + "开头");
}
}
if (name.length() < Config.Settings.MinLengthID) {
event.disallow(AsyncPlayerPreLoginEvent.Result.KICK_OTHER,
"你的游戏名太短了,至少需要 " + Config.Settings.MinLengthID + " 个字符的长度");
}
if (name.length() > Config.Settings.MaxLengthID) {
event.disallow(AsyncPlayerPreLoginEvent.Result.KICK_OTHER,
"你的游戏名太长了,最长只能到达 " + Config.Settings.MaxLengthID + " 个字符的长度");
String prefix = FloodgateApi.getInstance().getPlayerPrefix();
if (name.startsWith(prefix) && !FloodgateApi.getInstance().isFloodgatePlayer(event.getUniqueId())) {
event.disallow(AsyncPlayerPreLoginEvent.Result.KICK_OTHER, "非法的基岩版玩家名称,请非基岩版玩家的名称不要以" + prefix + "开头");
return;
}

}

if (name.length() < Config.Settings.MinLengthID) {
event.disallow(AsyncPlayerPreLoginEvent.Result.KICK_OTHER, "你的游戏名太短了,至少需要 " + Config.Settings.MinLengthID + " 个字符的长度");
} else if (name.length() > Config.Settings.MaxLengthID) {
event.disallow(AsyncPlayerPreLoginEvent.Result.KICK_OTHER, "你的游戏名太长了,最长只能到达 " + Config.Settings.MaxLengthID + " 个字符的长度");
}
}
}

0 comments on commit c0f21c9

Please sign in to comment.