From 9b85fd2d8c301b395a44e8b21acf918977f34a3a Mon Sep 17 00:00:00 2001 From: LoJoSho Date: Sun, 17 Dec 2023 22:41:12 -0600 Subject: [PATCH] feat: player teleport when entering wardrobe, allows better support for long distance wardrobes --- .../hmccosmetics/listener/PlayerConnectionListener.java | 2 +- .../hmccosmetics/listener/PlayerGameListener.java | 1 + .../java/com/hibiscusmc/hmccosmetics/user/CosmeticUser.java | 6 +++++- .../hmccosmetics/user/manager/UserWardrobeManager.java | 4 +++- 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/listener/PlayerConnectionListener.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/listener/PlayerConnectionListener.java index db27f7be..905d1f12 100644 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/listener/PlayerConnectionListener.java +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/listener/PlayerConnectionListener.java @@ -50,7 +50,7 @@ public class PlayerConnectionListener implements Listener { public void onPlayerQuit(@NotNull PlayerQuitEvent event) { CosmeticUser user = CosmeticUsers.getUser(event.getPlayer()); if (user == null) return; // Player never initialized, don't do anything - if (user.isInWardrobe()) user.leaveWardrobe(); + if (user.isInWardrobe()) user.leaveWardrobe(true); if (user.getUserEmoteManager().isPlayingEmote()) { user.getUserEmoteManager().stopEmote(UserEmoteManager.StopEmoteReason.CONNECTION); event.getPlayer().setInvisible(false); diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/listener/PlayerGameListener.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/listener/PlayerGameListener.java index eb78e2d0..175740fd 100644 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/listener/PlayerGameListener.java +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/listener/PlayerGameListener.java @@ -125,6 +125,7 @@ public class PlayerGameListener implements Listener { } Bukkit.getScheduler().runTaskLater(HMCCosmeticsPlugin.getInstance(), () -> { + if (user.getEntity() == null) return; // fixes disconnecting when in wardrobe if (user.hasCosmeticInSlot(CosmeticSlot.BACKPACK) && user.getUserBackpackManager() != null) { user.respawnBackpack(); } diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/user/CosmeticUser.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/user/CosmeticUser.java index c39206d5..15cd8bb8 100644 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/user/CosmeticUser.java +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/user/CosmeticUser.java @@ -332,6 +332,10 @@ public class CosmeticUser { } public void leaveWardrobe() { + leaveWardrobe(false); + } + + public void leaveWardrobe(boolean disconnecting) { PlayerWardrobeLeaveEvent event = new PlayerWardrobeLeaveEvent(this); Bukkit.getPluginManager().callEvent(event); if (event.isCancelled()) { @@ -342,7 +346,7 @@ public class CosmeticUser { getWardrobeManager().setWardrobeStatus(UserWardrobeManager.WardrobeStatus.STOPPING); - if (WardrobeSettings.isEnabledTransition()) { + if (WardrobeSettings.isEnabledTransition() && !disconnecting) { MessagesUtil.sendTitle( getPlayer(), WardrobeSettings.getTransitionText(), diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/user/manager/UserWardrobeManager.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/user/manager/UserWardrobeManager.java index ae6c3ce7..0bc97c9b 100644 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/user/manager/UserWardrobeManager.java +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/user/manager/UserWardrobeManager.java @@ -25,6 +25,7 @@ import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; import org.bukkit.scheduler.BukkitRunnable; @@ -105,6 +106,7 @@ public class UserWardrobeManager { PacketManager.sendLookPacket(ARMORSTAND_ID, viewingLocation, viewer); // Player + user.getPlayer().teleport(viewingLocation, PlayerTeleportEvent.TeleportCause.PLUGIN); PacketManager.gamemodeChangePacket(player, 3); PacketManager.sendCameraPacket(ARMORSTAND_ID, viewer); @@ -239,7 +241,7 @@ public class UserWardrobeManager { //PacketManager.sendLeashPacket(VIEWER.getBalloonEntity().getPufferfishBalloonId(), player.getEntityId(), viewer); } - player.teleport(Objects.requireNonNullElseGet(exitLocation, () -> player.getWorld().getSpawnLocation())); + player.teleport(Objects.requireNonNullElseGet(exitLocation, () -> player.getWorld().getSpawnLocation()), PlayerTeleportEvent.TeleportCause.PLUGIN); if (WardrobeSettings.isEquipPumpkin()) { NMSHandlers.getHandler().equipmentSlotUpdate(user.getPlayer().getEntityId(), EquipmentSlot.HEAD, player.getInventory().getHelmet(), viewer);