From d055990f47a604a9093f2d61c1d7eea3dfbe4810 Mon Sep 17 00:00:00 2001 From: MineSunshineone Date: Fri, 14 Feb 2025 01:33:23 +0800 Subject: [PATCH 1/2] fix --- pom.xml | 4 +- .../peek/handler/PeekStateHandler.java | 90 +++++++++---------- 2 files changed, 44 insertions(+), 50 deletions(-) diff --git a/pom.xml b/pom.xml index 248959a..16b294a 100644 --- a/pom.xml +++ b/pom.xml @@ -6,10 +6,10 @@ ict.minesunshineone peek - 2.8 + 2.9 - 21 + 17 UTF-8 diff --git a/src/main/java/ict/minesunshineone/peek/handler/PeekStateHandler.java b/src/main/java/ict/minesunshineone/peek/handler/PeekStateHandler.java index e875668..710902a 100644 --- a/src/main/java/ict/minesunshineone/peek/handler/PeekStateHandler.java +++ b/src/main/java/ict/minesunshineone/peek/handler/PeekStateHandler.java @@ -173,6 +173,7 @@ private void teleportAndSetGameMode(Player peeker, Player target) { peeker.setSpectatorTarget(null); } + // 先切换游戏模式 peeker.setGameMode(GameMode.SPECTATOR); // 切换完成后再传送 @@ -194,64 +195,57 @@ private void teleportAndSetGameMode(Player peeker, Player target) { public void restorePlayerState(Player peeker, PeekData data) { plugin.getServer().getRegionScheduler().run(plugin, data.getOriginalLocation(), task -> { - // 如果玩家在附身状态,先退出附身 if (peeker.getGameMode() == GameMode.SPECTATOR && peeker.getSpectatorTarget() != null) { peeker.setSpectatorTarget(null); } + // 先改变游戏模式 + peeker.setGameMode(data.getOriginalGameMode()); + + // 恢复状态 + peeker.setHealth(Math.min(data.getHealth(), 20)); + peeker.setFoodLevel(data.getFoodLevel()); + peeker.setSaturation(data.getSaturation()); + + // 清除现有效果并应用保存的效果 + peeker.getActivePotionEffects().forEach(effect + -> peeker.removePotionEffect(effect.getType())); + data.getPotionEffects().forEach(effect + -> peeker.addPotionEffect(effect)); + // 在传送前先清除动量 peeker.setVelocity(new Vector(0, 0, 0)); - peeker.teleportAsync(data.getOriginalLocation()).thenAccept(success -> { - if (success) { - // 传送成功后再改变游戏模式 - plugin.getServer().getRegionScheduler().run(plugin, data.getOriginalLocation(), modeTask -> { - // 再次确保动量为0 - peeker.setVelocity(new Vector(0, 0, 0)); - - peeker.setGameMode(data.getOriginalGameMode()); - // 恢复新增状态 - peeker.setHealth(Math.min(data.getHealth(), 20)); - peeker.setFoodLevel(data.getFoodLevel()); - peeker.setSaturation(data.getSaturation()); - - // 清除现有效果并应用保存的效果 - peeker.getActivePotionEffects().forEach(effect - -> peeker.removePotionEffect(effect.getType())); - data.getPotionEffects().forEach(effect - -> peeker.addPotionEffect(effect)); - }); - } else { - plugin.getLogger().warning(String.format( - "无法将玩家 %s 传送回原位置,正在尝试传送到重生点", - peeker.getName() - )); - - Location spawnLoc = peeker.getBedSpawnLocation() != null - ? peeker.getBedSpawnLocation() - : peeker.getWorld().getSpawnLocation(); - - if (spawnLoc != null) { - plugin.getServer().getRegionScheduler().run(plugin, spawnLoc, spawnTask -> { - peeker.teleportAsync(spawnLoc).thenAccept(spawnSuccess -> { - if (spawnSuccess) { - // 传送到重生点成功后再改变游戏模式 - plugin.getServer().getRegionScheduler().run(plugin, spawnLoc, modeTask -> { - peeker.setGameMode(data.getOriginalGameMode()); - }); - } else { - plugin.getLogger().severe(String.format( - "无法将玩家 %s 传送到任何安全位置", - peeker.getName() - )); - } + // 延迟1tick后传送 + plugin.getServer().getRegionScheduler().runDelayed(plugin, data.getOriginalLocation(), delayedTask -> { + peeker.teleportAsync(data.getOriginalLocation()).thenAccept(success -> { + if (!success) { + plugin.getLogger().warning(String.format( + "无法将玩家 %s 传送回原位置,正在尝试传送到重生点", + peeker.getName() + )); + + Location spawnLoc = peeker.getBedSpawnLocation() != null + ? peeker.getBedSpawnLocation() + : peeker.getWorld().getSpawnLocation(); + + if (spawnLoc != null) { + plugin.getServer().getRegionScheduler().run(plugin, spawnLoc, spawnTask -> { + peeker.teleportAsync(spawnLoc).thenAccept(spawnSuccess -> { + if (!spawnSuccess) { + plugin.getLogger().severe(String.format( + "无法将玩家 %s 传送到任何安全位置", + peeker.getName() + )); + } + }); }); - }); + } + plugin.getMessages().send(peeker, "teleport-failed"); } - plugin.getMessages().send(peeker, "teleport-failed"); - } - }); + }); + }, 10L); }); } From 94309be009566db45902b755858823b5d3f05ef7 Mon Sep 17 00:00:00 2001 From: MineSunshineone <107391209+MineSunshineone@users.noreply.github.com> Date: Fri, 14 Feb 2025 19:51:18 +0800 Subject: [PATCH 2/2] Update PeekStateHandler.java --- .../java/ict/minesunshineone/peek/handler/PeekStateHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ict/minesunshineone/peek/handler/PeekStateHandler.java b/src/main/java/ict/minesunshineone/peek/handler/PeekStateHandler.java index 710902a..e184f94 100644 --- a/src/main/java/ict/minesunshineone/peek/handler/PeekStateHandler.java +++ b/src/main/java/ict/minesunshineone/peek/handler/PeekStateHandler.java @@ -245,7 +245,7 @@ public void restorePlayerState(Player peeker, PeekData data) { plugin.getMessages().send(peeker, "teleport-failed"); } }); - }, 10L); + }, 5L); }); }