Skip to content

Commit 846e40c

Browse files
fix: 修复进服欢迎信息失效的问题
1 parent 2b3be6f commit 846e40c

3 files changed

Lines changed: 49 additions & 14 deletions

File tree

src/main/java/ict/minesunshineone/simpleTransfer/SimpleTransfer.java

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,12 @@ public void onServerConnected(ServerConnectedEvent event) {
251251
String serverName = server.getServerInfo().getName();
252252

253253
// 通知中间层:玩家成功连接到服务器
254-
loginMiddleware.onServerConnected(playerUuid);
254+
if (loginMiddleware.onServerConnected(playerUuid)) {
255+
// 登录/转移流程完成,显示欢迎消息
256+
showWelcomeMessageIfNeeded(player);
257+
// 清理中间层状态
258+
loginMiddleware.removePlayerState(playerUuid);
259+
}
255260

256261
// 超时保护:成功连接到服务器后,清理该服务器的失败记录
257262
if (configManager.isTransferTimeoutProtectionEnabled()) {
@@ -308,16 +313,21 @@ public void onKickedFromServer(KickedFromServerEvent event) {
308313
.append(Component.text(safeServer, NamedTextColor.GREEN))
309314
.build());
310315

311-
// 使用 KickedFromServerEvent 的结果重定向功能
312-
server.getServer(serverInfo.getHost())
313-
.ifPresent(registeredServer -> {
314-
event.setResult(KickedFromServerEvent.RedirectPlayer.create(registeredServer));
316+
// 使用插件 config.conf 中的服务器配置,不依赖 velocity.toml
317+
// 动态创建或获取 RegisteredServer
318+
com.velocitypowered.api.proxy.server.ServerInfo velocityServerInfo = new com.velocitypowered.api.proxy.server.ServerInfo(
319+
safeServer,
320+
new java.net.InetSocketAddress(serverInfo.getHost(), serverInfo.getPort()));
321+
322+
RegisteredServer registeredServer = server.getServer(safeServer)
323+
.orElseGet(() -> server.createRawRegisteredServer(velocityServerInfo));
315324

316-
if (configManager.isDebugMode()) {
317-
logger.info("[超时保护] 已将玩家 {} 重定向到安全服务器 {}",
318-
player.getUsername(), safeServer);
319-
}
320-
});
325+
event.setResult(KickedFromServerEvent.RedirectPlayer.create(registeredServer));
326+
327+
if (configManager.isDebugMode()) {
328+
logger.info("[超时保护] 已将玩家 {} 重定向到安全服务器 {} ({}:{})",
329+
player.getUsername(), safeServer, serverInfo.getHost(), serverInfo.getPort());
330+
}
321331
}
322332
}
323333
}

src/main/java/ict/minesunshineone/simpleTransfer/config/ConfigManager.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -395,6 +395,21 @@ public boolean isTransferTimeoutProtectionEnabled() {
395395
}
396396

397397
public String getFallbackServer() {
398+
// 解析格式: "groupName.serverName" (例如 "default.bgp")
399+
// 返回实际的服务器名称 (例如 "bgp")
400+
if (fallbackServer == null || fallbackServer.isEmpty()) {
401+
return null;
402+
}
403+
404+
// 如果包含点号,说明是 "group.server" 格式,提取服务器名
405+
if (fallbackServer.contains(".")) {
406+
String[] parts = fallbackServer.split("\\.", 2);
407+
if (parts.length == 2) {
408+
return parts[1]; // 返回服务器名称部分(例如 "bgp")
409+
}
410+
}
411+
412+
// 如果不包含点号,直接返回(向后兼容旧配置)
398413
return fallbackServer;
399414
}
400415

src/main/java/ict/minesunshineone/simpleTransfer/middleware/PlayerLoginMiddleware.java

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -426,9 +426,8 @@ private LoginResult executeTransfer(Player player, String routeName, String sour
426426
logger.info("玩家 {} 已经连接到线路 {} ({}:{}), 跳过转移",
427427
player.getUsername(), actualRouteName, currentHost, currentPort);
428428

429-
// 仍然返回 transfer 结果,以便正确记录线路信息
430-
// 但不执行实际的 transferToHost
431-
return LoginResult.transfer(actualRouteName);
429+
// 玩家已经在目标线路,直接标记为完成
430+
return LoginResult.completed();
432431
}
433432

434433
if (targetAddress.isUnresolved()) {
@@ -468,15 +467,26 @@ private LoginResult executeTransfer(Player player, String routeName, String sour
468467
/**
469468
* 当玩家成功连接到服务器时调用(由ServerConnectedEvent触发)
470469
* 用于完成TRANSFERRING状态
470+
*
471+
* @return true 如果刚刚完成了转移流程(状态从TRANSFERRING变为COMPLETED)
471472
*/
472-
public void onServerConnected(UUID uuid) {
473+
public boolean onServerConnected(UUID uuid) {
473474
LoginState state = playerStates.get(uuid);
474475
if (state == LoginState.TRANSFERRING) {
475476
// 转移完成
476477
playerStates.put(uuid, LoginState.COMPLETED);
477478
// 清理Future
478479
loginFutures.remove(uuid);
480+
return true;
479481
}
482+
return false;
483+
}
484+
485+
/**
486+
* 手动清理玩家状态
487+
*/
488+
public void removePlayerState(UUID uuid) {
489+
playerStates.remove(uuid);
480490
}
481491

482492
/**

0 commit comments

Comments
 (0)