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..e184f94 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"); - } - }); + }); + }, 5L); }); }