diff --git a/README.md b/README.md
index 842cd99..91b1975 100644
--- a/README.md
+++ b/README.md
@@ -241,11 +241,19 @@ whitelist:
# 简易的 ip 黑名单. 在这里添加正则表达式, 匹配的ip不允许加入服务器 (也不允许使用参观账户
# 使用 /wl reload 重载配置即可应用
+ # IP 地址格式: ipv4: "/127.0.0.1", ipv6: "/0:0:0:0:0:0:0:1" 没有方括号
ipBlacklist: [ ]
- # - '^192\.168\.100\..+$'
- # - '^fe80::1234:.+$' # IPv6 没有方括号
+ # - '^/192\.168\.100\..+$'
+ # - '^/fe80::1234:.+$'
ipBlacklistMsg: '§6IpacEL §f> §b您已被列入黑名单: §a%playerName%' # var: %ip%
+ # 限定玩家只能通过以下地址连接服务器
+ addressConfig:
+ enable: false
+ list: [ ]
+ # - '^0:0:0:0:0:0:0:0:25565$'
+ kickMsg: '§6IpacEL §f> §b此地址不可用'
+
# 玩家名称字符检查
# 名称长度为 3 到 16 字符, 允许包含 Geyser 的 "." 前缀
playerNameRule: '^(?:\.?[a-zA-Z0-9_]{3,16})$'
@@ -298,6 +306,13 @@ whitelist:
# 参观账户
VISIT:
+
+ # 限定参观模式可使用的地址
+ addressConfig:
+ enable: false
+ list: [ ]
+ kickMsg: '§6IpacEL §f> §b您不在白名单中'
+
# 参观账户的名称字符检查
playerNameRule: '^(?:\.?[a-zA-Z0-9_]{3,16})$'
playerNameRuleMsg: '§6IpacEL §f> §a名称中包含不支持的字符: §b%playerName%'
@@ -333,7 +348,7 @@ whitelist:
- 'gamemode spectator %playerName%' # 将玩家设置为观察模式
msg:
- '§6IpacEL §f> §a您正在使用参观账户=w='
- # - '§6IpacEL §f> §b如需加入, 请访问我们的网站: §ahttps://ipacel.cc/'
+ # - '§6IpacEL §f> §b如需加入, 请访问我们的网站: §ahttps://ipacel.cc/'
msgExclude:
- '§6IpacEL §f> §a%playerName% §b使用参观账户加入游戏'
diff --git a/pom.xml b/pom.xml
index 5f49718..d985f78 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
ApliNi
IpacWhitelist
- 4.1.1-rc1
+ 4.1.1-rc2
jar
IpacWhitelist
diff --git a/src/main/java/aplini/ipacwhitelist/listener/onPlayerLogin.java b/src/main/java/aplini/ipacwhitelist/listener/onPlayerLogin.java
index 8d2259c..9f664f4 100644
--- a/src/main/java/aplini/ipacwhitelist/listener/onPlayerLogin.java
+++ b/src/main/java/aplini/ipacwhitelist/listener/onPlayerLogin.java
@@ -17,7 +17,6 @@
import java.util.ArrayList;
import java.util.List;
-import java.util.Objects;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
import java.util.regex.Pattern;
@@ -47,6 +46,12 @@ public class onPlayerLogin implements Listener {
@EventHandler(priority = EventPriority.LOWEST) // 玩家登录服务器
public void onPlayerLoginEvent(PlayerLoginEvent event) {
+ // 如果结果已被设置, 我们可以忽略这个玩家
+ // 同时防止这个事件循环回来 (触发两次)
+ if(event.getResult() != PlayerLoginEvent.Result.ALLOWED){
+ return;
+ }
+
// 设置不允许登录的结果, 在允许登录的分支取消它. 防止出错造成意外的玩家登录
event.disallow(KICK_OTHER, config.getString("message.playerLoginErr", ""));
@@ -54,26 +59,24 @@ public void onPlayerLoginEvent(PlayerLoginEvent event) {
String playerName = player.getName();
String playerUUID = player.getUniqueId().toString();
String playerIP = event.getRealAddress().toString();
- playerIP = playerIP.substring(playerIP.lastIndexOf("/") +1);
+ String playerAddressHost = event.getHostname();
+ plugin.getLogger().info("%s[%s] -> Server[%s]".formatted(playerName, playerIP, playerAddressHost));
// 玩家 ip 地址检查
// 原始ip格式: ipv4: "/127.0.0.1", ipv6: "/0:0:0:0:0:0:0:1" 没有方括号
- for(String li : config.getStringList("whitelist.ipBlacklist")){
- if(Pattern.matches(li, playerIP)){
- plugin.getLogger().info("%s 在IP黑名单中: %s".formatted(playerName, playerIP));
- event.disallow(KICK_OTHER, msg(config.getString("whitelist.ipBlacklistMsg", ""), playerUUID, playerName)
- .replace(ph.ip.ph, playerIP));
- return;
- }
+ if(config.getStringList("whitelist.ipBlacklist").stream().anyMatch(li -> Pattern.matches(li, playerIP))){
+ plugin.getLogger().info("%s 在IP黑名单中: %s".formatted(playerName, playerIP));
+ event.disallow(KICK_OTHER, msg(config.getString("whitelist.ipBlacklistMsg", ""), playerUUID, playerName)
+ .replace(ph.ip.ph, playerIP));
+ return;
}
// 限定玩家只能通过以下地址加入服务器
- String playerAddressHost = Objects.requireNonNull(player.getAddress()).getHostString();
- plugin.getLogger().info("玩家 %s 通过地址 %s 连接服务器".formatted(playerName, playerAddressHost));
if(config.getBoolean("whitelist.addressConfig.enable", false)){
- if(!config.getStringList("whitelist.addressConfig.list").contains(playerAddressHost)){
+ if(config.getStringList("whitelist.addressConfig.list").stream().noneMatch(li -> Pattern.matches(li, playerAddressHost))){
event.disallow(KICK_OTHER, msg(config.getString("whitelist.addressConfig.kickMsg", ""), playerUUID, playerName));
+ return;
}
}
@@ -234,8 +237,9 @@ else if(onOtherPlayer != Type.NOT){
// 限定参观模式可使用的地址
if(config.getBoolean("whitelist.VISIT.addressConfig.enable", false)){
- if(!config.getStringList("whitelist.VISIT.addressConfig.list").contains(playerAddressHost)){
+ if(config.getStringList("whitelist.VISIT.addressConfig.list").stream().noneMatch(li -> Pattern.matches(li, playerAddressHost))){
event.disallow(KICK_OTHER, msg(config.getString("whitelist.VISIT.addressConfig.kickMsg", ""), playerUUID, playerName));
+ return;
}
}
diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml
index 1509426..39ce464 100644
--- a/src/main/resources/config.yml
+++ b/src/main/resources/config.yml
@@ -17,15 +17,17 @@ whitelist:
# 简易的 ip 黑名单. 在这里添加正则表达式, 匹配的ip不允许加入服务器 (也不允许使用参观账户
# 使用 /wl reload 重载配置即可应用
+ # IP 地址格式: ipv4: "/127.0.0.1", ipv6: "/0:0:0:0:0:0:0:1" 没有方括号
ipBlacklist: [ ]
- # - '^192\.168\.100\..+$'
- # - '^fe80::1234:.+$' # IPv6 没有方括号
+ # - '^/192\.168\.100\..+$'
+ # - '^/fe80::1234:.+$'
ipBlacklistMsg: '§6IpacEL §f> §b您已被列入黑名单: §a%playerName%' # var: %ip%
- # 限定玩家只能通过以下地址加入服务器
+ # 限定玩家只能通过以下地址连接服务器
addressConfig:
enable: false
list: [ ]
+ # - '^0:0:0:0:0:0:0:0:25565$'
kickMsg: '§6IpacEL §f> §b此地址不可用'
# 玩家名称字符检查
@@ -85,7 +87,7 @@ whitelist:
addressConfig:
enable: false
list: [ ]
- kickMsg: '§6IpacEL §f> §b您不在白名单中, 请使用参观地址加入服务器'
+ kickMsg: '§6IpacEL §f> §b您不在白名单中'
# 参观账户的名称字符检查
playerNameRule: '^(?:\.?[a-zA-Z0-9_]{3,16})$'
@@ -122,7 +124,7 @@ whitelist:
- 'gamemode spectator %playerName%' # 将玩家设置为观察模式
msg:
- '§6IpacEL §f> §a您正在使用参观账户=w='
-# - '§6IpacEL §f> §b如需加入, 请访问我们的网站: §ahttps://ipacel.cc/'
+ # - '§6IpacEL §f> §b如需加入, 请访问我们的网站: §ahttps://ipacel.cc/'
msgExclude:
- '§6IpacEL §f> §a%playerName% §b使用参观账户加入游戏'