From ac0a1588db62e92ceb3068390a7f06a25da74202 Mon Sep 17 00:00:00 2001 From: Martin Sulikowski Date: Sat, 13 Sep 2025 22:19:21 +0200 Subject: [PATCH 01/18] WIP permission for back on death. --- ...n_0010_Move_back_to_dedicated_section.java | 17 ++++ .../core/feature/back/BackCommand.java | 79 +++++++++++++++++ .../core/feature/back/BackController.java | 35 ++++++++ .../core/feature/back/BackService.java | 62 ++++++++++++++ .../feature/back/messages/BackMessages.java | 17 ++++ .../feature/back/messages/ENBackMessages.java | 18 ++++ .../feature/back/messages/PLBackMessages.java | 18 ++++ .../teleport/command/TeleportBackCommand.java | 84 ------------------- .../core/translation/Translation.java | 7 +- .../implementation/ENTranslation.java | 15 ++-- .../implementation/PLTranslation.java | 7 ++ 11 files changed, 262 insertions(+), 97 deletions(-) create mode 100644 eternalcore-core/src/main/java/com/eternalcode/core/configuration/migrations/Migration_0010_Move_back_to_dedicated_section.java create mode 100644 eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackCommand.java create mode 100644 eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackController.java create mode 100644 eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackService.java create mode 100644 eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/BackMessages.java create mode 100644 eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/ENBackMessages.java create mode 100644 eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/PLBackMessages.java delete mode 100644 eternalcore-core/src/main/java/com/eternalcode/core/feature/teleport/command/TeleportBackCommand.java diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/migrations/Migration_0010_Move_back_to_dedicated_section.java b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/migrations/Migration_0010_Move_back_to_dedicated_section.java new file mode 100644 index 000000000..b324ba3aa --- /dev/null +++ b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/migrations/Migration_0010_Move_back_to_dedicated_section.java @@ -0,0 +1,17 @@ +package com.eternalcode.core.configuration.migrations; + +import eu.okaeri.configs.migrate.builtin.NamedMigration; + +import static eu.okaeri.configs.migrate.ConfigMigrationDsl.move; + +public class Migration_0010_Move_back_to_dedicated_section extends NamedMigration { + Migration_0010_Move_back_to_dedicated_section() { + super( + "Improve homes config", + move("teleport.teleportedToLastLocation", "back.lastLocationNoExist"), + move("teleport.teleportedSpecifiedPlayerLastLocation", "back.teleportedSpecifiedPlayerLastLocation"), + move("teleport.lastLocationNoExist", "back.lastLocationNoExist") + ); + } +} + diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackCommand.java new file mode 100644 index 000000000..974601815 --- /dev/null +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackCommand.java @@ -0,0 +1,79 @@ +package com.eternalcode.core.feature.back; + +import com.eternalcode.annotations.scan.command.DescriptionDocs; +import com.eternalcode.core.injector.annotations.Inject; +import com.eternalcode.core.notice.NoticeService; +import com.eternalcode.core.viewer.Viewer; +import dev.rollczi.litecommands.annotations.argument.Arg; +import dev.rollczi.litecommands.annotations.command.Command; +import dev.rollczi.litecommands.annotations.context.Sender; +import dev.rollczi.litecommands.annotations.execute.Execute; +import dev.rollczi.litecommands.annotations.permission.Permission; +import org.bukkit.entity.Player; + +import java.util.Optional; + +@Command(name = "back") +public class BackCommand { + + private static final String PERMISSION_BACK_ON_DEATH = "eternalcore.back.ondeath"; + + private final BackService backService; + private final NoticeService noticeService; + + @Inject + public BackCommand(BackService backService, NoticeService noticeService) { + this.backService = backService; + this.noticeService = noticeService; + } + + @Execute + @Permission("eternalcore.back") + @DescriptionDocs(description = "Teleport to last location") + public void execute(@Sender Player player) { + Optional backLocation = this.backService.getBackLocation(player.getUniqueId()); + + if (backLocation.isEmpty()) { + this.noticeService.player(player.getUniqueId(), translation -> translation.back().lastLocationNoExist()); + return; + } + + BackService.BackLocation location = backLocation.get(); + + if (location.isFromDeath() && !player.hasPermission(PERMISSION_BACK_ON_DEATH)) { + this.noticeService.player(player.getUniqueId(), translation -> translation.back().noPermissionBackOnDeath()); + return; + } + + this.backService.teleportBack(player, location.location()); + this.noticeService.player(player.getUniqueId(), translation -> translation.back().teleportedToLastLocation()); + } + + @Execute + @Permission("eternalcore.back.other") + @DescriptionDocs(description = "Teleport specified player to last location", arguments = "") + public void execute(@Sender Viewer viewer, @Arg Player target) { + Optional backLocation = this.backService.getBackLocation(target.getUniqueId()); + + if (backLocation.isEmpty()) { + this.noticeService.viewer(viewer, translation -> translation.back().lastLocationNoExist()); + return; + } + + BackService.BackLocation location = backLocation.get(); + + if (location.isFromDeath() && !target.hasPermission(PERMISSION_BACK_ON_DEATH)) { + this.noticeService.viewer(viewer, translation -> translation.back().targetNoPermissionBackOnDeath()); + return; + } + + this.backService.teleportBack(target, location.location()); + this.noticeService.player(target.getUniqueId(), translation -> translation.back().teleportedToLastLocation()); + + this.noticeService.create() + .viewer(viewer) + .notice(translation -> translation.back().teleportedSpecifiedPlayerLastLocation()) + .placeholder("{PLAYER}", target.getName()) + .send(); + } +} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackController.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackController.java new file mode 100644 index 000000000..a3dc1e008 --- /dev/null +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackController.java @@ -0,0 +1,35 @@ +package com.eternalcode.core.feature.back; + +import com.eternalcode.core.injector.annotations.Inject; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.PlayerTeleportEvent; + +public class BackController implements Listener { + + private final BackService backService; + + @Inject + public BackController(BackService backService) { + this.backService = backService; + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onPlayerDeath(PlayerDeathEvent event) { + Player entity = event.getEntity(); + + this.backService.setBackLocation(entity.getUniqueId(), entity.getLocation(), true); + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onPlayerTeleport(PlayerTeleportEvent event) { + if (event.getCause() == PlayerTeleportEvent.TeleportCause.PLUGIN) { + return; + } + + this.backService.setBackLocation(event.getPlayer().getUniqueId(), event.getFrom(), false); + } +} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackService.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackService.java new file mode 100644 index 000000000..d8a35876e --- /dev/null +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackService.java @@ -0,0 +1,62 @@ +package com.eternalcode.core.feature.back; + +import com.eternalcode.commons.bukkit.position.PositionAdapter; +import com.eternalcode.core.feature.teleport.TeleportService; +import com.eternalcode.core.feature.teleport.TeleportTaskService; +import com.eternalcode.core.feature.teleportrequest.TeleportRequestSettings; +import com.eternalcode.core.injector.annotations.Inject; +import com.eternalcode.core.injector.annotations.component.Service; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; + +@Service +public class BackService { + + private final TeleportService teleportService; + private final TeleportTaskService teleportTaskService; + private final TeleportRequestSettings settings; + + private final Map backLocations = new HashMap<>(); + + @Inject + public BackService( + TeleportService teleportService, + TeleportTaskService teleportTaskService, + TeleportRequestSettings settings + ) { + this.teleportService = teleportService; + this.teleportTaskService = teleportTaskService; + this.settings = settings; + } + + public Optional getBackLocation(UUID playerId) { + return Optional.ofNullable(backLocations.get(playerId)); + } + + public void setBackLocation(UUID playerId, Location location, boolean isFromDeath) { + backLocations.put(playerId, new BackLocation(location, isFromDeath)); + } + + public void teleportBack(Player player, Location location) { + if (player.hasPermission("eternalcore.teleport.bypass")) { + teleportService.teleport(player, location); + } + else { + teleportTaskService.createTeleport( + player.getUniqueId(), + PositionAdapter.convert(player.getLocation()), + PositionAdapter.convert(location), + settings.tpaTimer() + ); + } + } + + public record BackLocation(Location location, boolean isFromDeath) { + } +} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/BackMessages.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/BackMessages.java new file mode 100644 index 000000000..b47eca2e2 --- /dev/null +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/BackMessages.java @@ -0,0 +1,17 @@ +package com.eternalcode.core.feature.back.messages; + +import com.eternalcode.multification.notice.Notice; + +public interface BackMessages { + + Notice lastLocationNoExist(); + + Notice noPermissionBackOnDeath(); + + Notice targetNoPermissionBackOnDeath(); + + Notice teleportedToLastLocation(); + + Notice teleportedSpecifiedPlayerLastLocation(); + +} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/ENBackMessages.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/ENBackMessages.java new file mode 100644 index 000000000..b7721e982 --- /dev/null +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/ENBackMessages.java @@ -0,0 +1,18 @@ +package com.eternalcode.core.feature.back.messages; + +import com.eternalcode.multification.notice.Notice; +import eu.okaeri.configs.OkaeriConfig; +import lombok.Getter; +import lombok.experimental.Accessors; + +@Getter +@Accessors(fluent = true) +public class ENBackMessages extends OkaeriConfig implements BackMessages { + + public Notice lastLocationNoExist = Notice.chat("You don't have any last location to teleport to!"); + public Notice noPermissionBackOnDeath = Notice.chat("You don't have permission to use /back after death!"); + public Notice targetNoPermissionBackOnDeath = Notice.chat("Player doesn't have permission to use /back after death!"); + public Notice teleportedToLastLocation = Notice.chat("You have been teleported to your last location!"); + public Notice teleportedSpecifiedPlayerLastLocation = Notice.chat("Player {PLAYER} has been teleported to their last location!"); + +} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/PLBackMessages.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/PLBackMessages.java new file mode 100644 index 000000000..ccf2bc84e --- /dev/null +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/PLBackMessages.java @@ -0,0 +1,18 @@ +package com.eternalcode.core.feature.back.messages; + +import com.eternalcode.multification.notice.Notice; +import eu.okaeri.configs.OkaeriConfig; +import lombok.Getter; +import lombok.experimental.Accessors; + +@Getter +@Accessors(fluent = true) +public class PLBackMessages extends OkaeriConfig implements BackMessages { + + public Notice lastLocationNoExist = Notice.chat("Nie masz żadnej ostatniej lokalizacji, do której można się teleportować!"); + public Notice noPermissionBackOnDeath = Notice.chat("Nie masz uprawnień do używania /back po śmierci!"); + public Notice targetNoPermissionBackOnDeath = Notice.chat("Gracz nie ma uprawnień do używania /back po śmierci!"); + public Notice teleportedToLastLocation = Notice.chat("Zostałeś przeteleportowany do ostatniej lokalizacji!"); + public Notice teleportedSpecifiedPlayerLastLocation = Notice.chat("Gracz {PLAYER} został przeteleportowany do swojej ostatniej lokalizacji!"); + +} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleport/command/TeleportBackCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleport/command/TeleportBackCommand.java deleted file mode 100644 index 078bb8bc4..000000000 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleport/command/TeleportBackCommand.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.eternalcode.core.feature.teleport.command; - -import com.eternalcode.annotations.scan.command.DescriptionDocs; -import com.eternalcode.commons.bukkit.position.PositionAdapter; -import com.eternalcode.core.feature.teleport.TeleportService; -import com.eternalcode.core.feature.teleport.TeleportTaskService; -import com.eternalcode.core.feature.teleportrequest.TeleportRequestSettings; -import com.eternalcode.core.injector.annotations.Inject; -import com.eternalcode.core.notice.NoticeService; -import com.eternalcode.core.viewer.Viewer; -import dev.rollczi.litecommands.annotations.argument.Arg; -import dev.rollczi.litecommands.annotations.command.Command; -import dev.rollczi.litecommands.annotations.context.Sender; -import dev.rollczi.litecommands.annotations.execute.Execute; -import dev.rollczi.litecommands.annotations.permission.Permission; -import java.util.Optional; -import org.bukkit.Location; -import org.bukkit.entity.Player; - -@Command(name = "back") -class TeleportBackCommand { - - private final TeleportService teleportService; - private final TeleportTaskService teleportTaskService; - private final TeleportRequestSettings settings; - private final NoticeService noticeService; - - @Inject - TeleportBackCommand(TeleportService teleportService, TeleportTaskService teleportTaskService, TeleportRequestSettings settings, NoticeService noticeService) { - this.teleportService = teleportService; - this.teleportTaskService = teleportTaskService; - this.settings = settings; - this.noticeService = noticeService; - } - - @Execute - @Permission("eternalcore.back") - @DescriptionDocs(description = "Teleport to last location") - void execute(@Sender Player player) { - Optional location = this.teleportService.getLastLocation(player.getUniqueId()); - - if (location.isEmpty()) { - this.noticeService.player(player.getUniqueId(), translation -> translation.teleport().lastLocationNoExist()); - - return; - } - - if (player.hasPermission("eternalcore.teleport.bypass")) { - this.teleportService.teleport(player, location.get()); - } else { - this.teleportTaskService.createTeleport(player.getUniqueId(), PositionAdapter.convert(player.getLocation()), PositionAdapter.convert(location.get()), this.settings.tpaTimer()); - } - - this.noticeService.player(player.getUniqueId(), translation -> translation.teleport().teleportedToLastLocation()); - } - - @Execute - @Permission("eternalcore.back.other") - @DescriptionDocs(description = "Teleport specified player to last location", arguments = "") - void execute(@Sender Viewer viewer, @Arg Player player) { - Optional location = this.teleportService.getLastLocation(player.getUniqueId()); - - if (location.isEmpty()) { - this.noticeService.viewer(viewer, translation -> translation.teleport().lastLocationNoExist()); - - return; - } - - if (player.hasPermission("eternalcore.teleport.bypass")){ - this.teleportService.teleport(player, location.get()); - } else { - this.teleportTaskService.createTeleport(player.getUniqueId(), PositionAdapter.convert(player.getLocation()), PositionAdapter.convert(location.get()), this.settings.tpaTimer()); - } - - this.noticeService.player(player.getUniqueId(), translation -> translation.teleport().teleportedToLastLocation()); - - this.noticeService.create() - .viewer(viewer) - .notice(translation -> translation.teleport().teleportedSpecifiedPlayerLastLocation()) - .placeholder("{PLAYER}", player.getName()) - .send(); - } - -} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/translation/Translation.java b/eternalcore-core/src/main/java/com/eternalcode/core/translation/Translation.java index a42dfee99..4cd39e97c 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/translation/Translation.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/translation/Translation.java @@ -1,5 +1,6 @@ package com.eternalcode.core.translation; +import com.eternalcode.core.feature.back.messages.BackMessages; import com.eternalcode.core.feature.freeze.messages.FreezeMessages; import com.eternalcode.core.feature.playtime.messages.PlaytimeMessages; import com.eternalcode.core.feature.clear.messages.ClearMessages; @@ -67,11 +68,6 @@ interface TeleportSection { // Coordinates XYZ Notice teleportedToCoordinates(); Notice teleportedSpecifiedPlayerToCoordinates(); - - // Back - Notice teleportedToLastLocation(); - Notice teleportedSpecifiedPlayerLastLocation(); - Notice lastLocationNoExist(); } interface ChatSection { @@ -195,6 +191,7 @@ interface ItemSection { SudoMessages sudo(); // Teleport Section TeleportSection teleport(); + BackMessages back(); // teleport to random player section. TeleportToRandomPlayerMessages teleportToRandomPlayer(); // Random Teleport Section diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/translation/implementation/ENTranslation.java b/eternalcore-core/src/main/java/com/eternalcode/core/translation/implementation/ENTranslation.java index 690468e0f..09fff6bdf 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/translation/implementation/ENTranslation.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/translation/implementation/ENTranslation.java @@ -1,5 +1,6 @@ package com.eternalcode.core.translation.implementation; +import com.eternalcode.core.feature.back.messages.ENBackMessages; import com.eternalcode.core.feature.freeze.messages.ENFreezeMessages; import com.eternalcode.core.feature.playtime.messages.ENPlaytimeMessages; import com.eternalcode.core.feature.clear.messages.ENClearMessages; @@ -215,16 +216,14 @@ public static class ENTeleportSection extends OkaeriConfig implements TeleportSe public Notice teleportedToCoordinates = Notice.chat("Teleported to location x: {X}, y: {Y}, z: {Z}"); @Comment({" ", "# {PLAYER} - Player who has been teleported, {X} - X coordinate, {Y} - Y coordinate, {Z} - Z coordinate"}) public Notice teleportedSpecifiedPlayerToCoordinates = Notice.chat("Teleported {PLAYER} to location x: {X}, y: {Y}, z: {Z}"); - - // Back - @Comment(" ") - public Notice teleportedToLastLocation = Notice.chat("Teleported to the last location!"); - @Comment({" ", "# {PLAYER} - Player who has been teleported"}) - public Notice teleportedSpecifiedPlayerLastLocation = Notice.chat("Teleported {PLAYER} to the last location!"); - @Comment(" ") - public Notice lastLocationNoExist = Notice.chat("Last location is not exist!"); } + @Comment({ + " ", + "# This section is responsible for the messages of the /back command", + }) + public ENBackMessages back = new ENBackMessages(); + @Comment({ " ", "# This section is responsible for the messages of the /tprp command", diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/translation/implementation/PLTranslation.java b/eternalcore-core/src/main/java/com/eternalcode/core/translation/implementation/PLTranslation.java index 35a1a6674..ff1f22bea 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/translation/implementation/PLTranslation.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/translation/implementation/PLTranslation.java @@ -1,5 +1,6 @@ package com.eternalcode.core.translation.implementation; +import com.eternalcode.core.feature.back.messages.PLBackMessages; import com.eternalcode.core.feature.freeze.messages.PLFreezeMessages; import com.eternalcode.core.feature.near.messages.PLNearMessages; import com.eternalcode.core.feature.playtime.messages.PLPlaytimeMessages; @@ -232,6 +233,12 @@ public static class PLTeleportSection extends OkaeriConfig implements TeleportSe public Notice lastLocationNoExist = Notice.chat("Nie ma zapisanej ostatniej lokalizacji!"); } + @Comment({ + " ", + "# Ta sekcja odpowiada za wiadomości komendy /back" + }) + public PLBackMessages back = new PLBackMessages(); + @Comment({ " ", "# Ta sekcja odpowiada za wiadomości komendy /tprp" From 32bce4b28ee3f8cf912c8ce708d2a17c0e4f42ac Mon Sep 17 00:00:00 2001 From: Jakubk15 <77227023+Jakubk15@users.noreply.github.com> Date: Sat, 4 Oct 2025 18:39:55 +0200 Subject: [PATCH 02/18] Improve back logic --- .../core/feature/back/BackCommand.java | 73 +++++++++++++------ .../core/feature/back/BackService.java | 39 +++++++--- .../feature/back/messages/BackMessages.java | 4 - .../feature/back/messages/ENBackMessages.java | 2 - .../feature/back/messages/PLBackMessages.java | 2 - 5 files changed, 77 insertions(+), 43 deletions(-) diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackCommand.java index 974601815..f6ed7f624 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackCommand.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackCommand.java @@ -1,6 +1,7 @@ package com.eternalcode.core.feature.back; import com.eternalcode.annotations.scan.command.DescriptionDocs; +import com.eternalcode.core.feature.back.BackService.BackLocation; import com.eternalcode.core.injector.annotations.Inject; import com.eternalcode.core.notice.NoticeService; import com.eternalcode.core.viewer.Viewer; @@ -9,15 +10,13 @@ import dev.rollczi.litecommands.annotations.context.Sender; import dev.rollczi.litecommands.annotations.execute.Execute; import dev.rollczi.litecommands.annotations.permission.Permission; -import org.bukkit.entity.Player; - import java.util.Optional; +import org.bukkit.entity.Player; +import panda.std.Pair; @Command(name = "back") public class BackCommand { - private static final String PERMISSION_BACK_ON_DEATH = "eternalcore.back.ondeath"; - private final BackService backService; private final NoticeService noticeService; @@ -27,47 +26,73 @@ public BackCommand(BackService backService, NoticeService noticeService) { this.noticeService = noticeService; } - @Execute - @Permission("eternalcore.back") - @DescriptionDocs(description = "Teleport to last location") - public void execute(@Sender Player player) { - Optional backLocation = this.backService.getBackLocation(player.getUniqueId()); + @Execute(name = "death") + @Permission("eternalcore.back.death") + @DescriptionDocs(description = "Teleport to your last death location") + public void executeBackDeath(@Sender Player player) { + Optional> backPair = this.backService.getBackLocationPair(player.getUniqueId()); - if (backLocation.isEmpty()) { + if (backPair.isEmpty() || backPair.get().getFirst() == null) { this.noticeService.player(player.getUniqueId(), translation -> translation.back().lastLocationNoExist()); return; } - BackService.BackLocation location = backLocation.get(); + BackLocation deathLocation = backPair.get().getFirst(); + this.backService.teleportBack(player, deathLocation.location()); + this.noticeService.player(player.getUniqueId(), translation -> translation.back().teleportedToLastLocation()); + } + + @Execute(name = "teleport") + @Permission("eternalcore.back.teleport") + @DescriptionDocs(description = "Teleport to your last teleport location") + public void executeBackTeleport(@Sender Player player) { + Optional> backPair = this.backService.getBackLocationPair(player.getUniqueId()); - if (location.isFromDeath() && !player.hasPermission(PERMISSION_BACK_ON_DEATH)) { - this.noticeService.player(player.getUniqueId(), translation -> translation.back().noPermissionBackOnDeath()); + if (backPair.isEmpty() || backPair.get().getSecond() == null) { + this.noticeService.player(player.getUniqueId(), translation -> translation.back().lastLocationNoExist()); return; } - this.backService.teleportBack(player, location.location()); + BackLocation teleportLocation = backPair.get().getSecond(); + this.backService.teleportBack(player, teleportLocation.location()); this.noticeService.player(player.getUniqueId(), translation -> translation.back().teleportedToLastLocation()); } - @Execute - @Permission("eternalcore.back.other") - @DescriptionDocs(description = "Teleport specified player to last location", arguments = "") - public void execute(@Sender Viewer viewer, @Arg Player target) { - Optional backLocation = this.backService.getBackLocation(target.getUniqueId()); + @Execute(name = "death") + @Permission("eternalcore.back.death.other") + @DescriptionDocs(description = "Teleport specified player to their last death location", arguments = "") + public void executeBackDeathOther(@Sender Viewer viewer, @Arg Player target) { + Optional> backPair = this.backService.getBackLocationPair(target.getUniqueId()); - if (backLocation.isEmpty()) { + if (backPair.isEmpty() || backPair.get().getFirst() == null) { this.noticeService.viewer(viewer, translation -> translation.back().lastLocationNoExist()); return; } - BackService.BackLocation location = backLocation.get(); + BackLocation deathLocation = backPair.get().getFirst(); + this.backService.teleportBack(target, deathLocation.location()); + this.noticeService.player(target.getUniqueId(), translation -> translation.back().teleportedToLastLocation()); + + this.noticeService.create() + .viewer(viewer) + .notice(translation -> translation.back().teleportedSpecifiedPlayerLastLocation()) + .placeholder("{PLAYER}", target.getName()) + .send(); + } - if (location.isFromDeath() && !target.hasPermission(PERMISSION_BACK_ON_DEATH)) { - this.noticeService.viewer(viewer, translation -> translation.back().targetNoPermissionBackOnDeath()); + @Execute(name = "teleport") + @Permission("eternalcore.back.teleport.other") + @DescriptionDocs(description = "Teleport specified player to their last teleport location", arguments = "") + public void executeBackTeleportOther(@Sender Viewer viewer, @Arg Player target) { + Optional> backPair = this.backService.getBackLocationPair(target.getUniqueId()); + + if (backPair.isEmpty() || backPair.get().getSecond() == null) { + this.noticeService.viewer(viewer, translation -> translation.back().lastLocationNoExist()); return; } - this.backService.teleportBack(target, location.location()); + BackLocation teleportLocation = backPair.get().getSecond(); + this.backService.teleportBack(target, teleportLocation.location()); this.noticeService.player(target.getUniqueId(), translation -> translation.back().teleportedToLastLocation()); this.noticeService.create() diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackService.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackService.java index d8a35876e..6c0b29999 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackService.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackService.java @@ -6,14 +6,14 @@ import com.eternalcode.core.feature.teleportrequest.TeleportRequestSettings; import com.eternalcode.core.injector.annotations.Inject; import com.eternalcode.core.injector.annotations.component.Service; -import org.bukkit.Location; -import org.bukkit.entity.Player; - -import java.util.HashMap; -import java.util.Map; +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; import java.util.Optional; import java.util.UUID; -import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; +import org.bukkit.Location; +import org.bukkit.entity.Player; +import panda.std.Pair; @Service public class BackService { @@ -22,7 +22,7 @@ public class BackService { private final TeleportTaskService teleportTaskService; private final TeleportRequestSettings settings; - private final Map backLocations = new HashMap<>(); + private final Cache> backLocationsCache; @Inject public BackService( @@ -33,14 +33,31 @@ public BackService( this.teleportService = teleportService; this.teleportTaskService = teleportTaskService; this.settings = settings; + + this.backLocationsCache = Caffeine.newBuilder() + .maximumSize(1000) + .expireAfterWrite(2, TimeUnit.HOURS) + .build(); } - public Optional getBackLocation(UUID playerId) { - return Optional.ofNullable(backLocations.get(playerId)); + public Optional> getBackLocationPair(UUID playerId) { + return Optional.ofNullable(backLocationsCache.getIfPresent(playerId)); } public void setBackLocation(UUID playerId, Location location, boolean isFromDeath) { - backLocations.put(playerId, new BackLocation(location, isFromDeath)); + Pair existing = backLocationsCache.getIfPresent(playerId); + BackLocation newLocation = new BackLocation(location); + BackLocation deathLocation; + BackLocation normalLocation; + if (existing == null) { + deathLocation = isFromDeath ? newLocation : null; + normalLocation = isFromDeath ? null : newLocation; + } + else { + deathLocation = isFromDeath ? newLocation : existing.getFirst(); + normalLocation = isFromDeath ? existing.getSecond() : newLocation; + } + backLocationsCache.put(playerId, Pair.of(deathLocation, normalLocation)); } public void teleportBack(Player player, Location location) { @@ -57,6 +74,6 @@ public void teleportBack(Player player, Location location) { } } - public record BackLocation(Location location, boolean isFromDeath) { + public record BackLocation(Location location) { } } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/BackMessages.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/BackMessages.java index b47eca2e2..5b0fecff3 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/BackMessages.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/BackMessages.java @@ -6,10 +6,6 @@ public interface BackMessages { Notice lastLocationNoExist(); - Notice noPermissionBackOnDeath(); - - Notice targetNoPermissionBackOnDeath(); - Notice teleportedToLastLocation(); Notice teleportedSpecifiedPlayerLastLocation(); diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/ENBackMessages.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/ENBackMessages.java index b7721e982..685ce339e 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/ENBackMessages.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/ENBackMessages.java @@ -10,8 +10,6 @@ public class ENBackMessages extends OkaeriConfig implements BackMessages { public Notice lastLocationNoExist = Notice.chat("You don't have any last location to teleport to!"); - public Notice noPermissionBackOnDeath = Notice.chat("You don't have permission to use /back after death!"); - public Notice targetNoPermissionBackOnDeath = Notice.chat("Player doesn't have permission to use /back after death!"); public Notice teleportedToLastLocation = Notice.chat("You have been teleported to your last location!"); public Notice teleportedSpecifiedPlayerLastLocation = Notice.chat("Player {PLAYER} has been teleported to their last location!"); diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/PLBackMessages.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/PLBackMessages.java index ccf2bc84e..275dc1e0c 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/PLBackMessages.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/PLBackMessages.java @@ -10,8 +10,6 @@ public class PLBackMessages extends OkaeriConfig implements BackMessages { public Notice lastLocationNoExist = Notice.chat("Nie masz żadnej ostatniej lokalizacji, do której można się teleportować!"); - public Notice noPermissionBackOnDeath = Notice.chat("Nie masz uprawnień do używania /back po śmierci!"); - public Notice targetNoPermissionBackOnDeath = Notice.chat("Gracz nie ma uprawnień do używania /back po śmierci!"); public Notice teleportedToLastLocation = Notice.chat("Zostałeś przeteleportowany do ostatniej lokalizacji!"); public Notice teleportedSpecifiedPlayerLastLocation = Notice.chat("Gracz {PLAYER} został przeteleportowany do swojej ostatniej lokalizacji!"); From c733197266ece7b0a0d822aef10e959076b5652b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20K=C4=99dziora?= <77227023+Jakubk15@users.noreply.github.com> Date: Sat, 4 Oct 2025 22:13:04 +0200 Subject: [PATCH 03/18] Update eternalcore-core/src/main/java/com/eternalcode/core/configuration/migrations/Migration_0010_Move_back_to_dedicated_section.java Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- .../Migration_0010_Move_back_to_dedicated_section.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/migrations/Migration_0010_Move_back_to_dedicated_section.java b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/migrations/Migration_0010_Move_back_to_dedicated_section.java index b324ba3aa..e627ca0a5 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/migrations/Migration_0010_Move_back_to_dedicated_section.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/migrations/Migration_0010_Move_back_to_dedicated_section.java @@ -8,7 +8,7 @@ public class Migration_0010_Move_back_to_dedicated_section extends NamedMigratio Migration_0010_Move_back_to_dedicated_section() { super( "Improve homes config", - move("teleport.teleportedToLastLocation", "back.lastLocationNoExist"), + move("teleport.teleportedToLastLocation", "back.teleportedToLastLocation"), move("teleport.teleportedSpecifiedPlayerLastLocation", "back.teleportedSpecifiedPlayerLastLocation"), move("teleport.lastLocationNoExist", "back.lastLocationNoExist") ); From a2b33a8ca7550e074739d9b3c383009d88939943 Mon Sep 17 00:00:00 2001 From: Jakubk15 <77227023+Jakubk15@users.noreply.github.com> Date: Sat, 11 Oct 2025 21:00:17 +0200 Subject: [PATCH 04/18] Adjust to others' suggestions --- ..._0030_Move_back_to_dedicated_section.java} | 14 ++-- .../configuration/migrations/Migrations.java | 1 + .../core/feature/back/BackCommand.java | 75 ++++++++----------- .../core/feature/back/BackController.java | 5 +- .../core/feature/back/BackService.java | 49 ++++++------ .../feature/back/messages/BackMessages.java | 10 ++- .../feature/back/messages/ENBackMessages.java | 14 +++- .../feature/back/messages/PLBackMessages.java | 16 +++- 8 files changed, 96 insertions(+), 88 deletions(-) rename eternalcore-core/src/main/java/com/eternalcode/core/configuration/migrations/{Migration_0010_Move_back_to_dedicated_section.java => Migration_0030_Move_back_to_dedicated_section.java} (68%) diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/migrations/Migration_0010_Move_back_to_dedicated_section.java b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/migrations/Migration_0030_Move_back_to_dedicated_section.java similarity index 68% rename from eternalcore-core/src/main/java/com/eternalcode/core/configuration/migrations/Migration_0010_Move_back_to_dedicated_section.java rename to eternalcore-core/src/main/java/com/eternalcode/core/configuration/migrations/Migration_0030_Move_back_to_dedicated_section.java index e627ca0a5..72cda251c 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/migrations/Migration_0010_Move_back_to_dedicated_section.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/migrations/Migration_0030_Move_back_to_dedicated_section.java @@ -1,16 +1,16 @@ package com.eternalcode.core.configuration.migrations; -import eu.okaeri.configs.migrate.builtin.NamedMigration; - import static eu.okaeri.configs.migrate.ConfigMigrationDsl.move; -public class Migration_0010_Move_back_to_dedicated_section extends NamedMigration { - Migration_0010_Move_back_to_dedicated_section() { +import eu.okaeri.configs.migrate.builtin.NamedMigration; + +public class Migration_0030_Move_back_to_dedicated_section extends NamedMigration { + Migration_0030_Move_back_to_dedicated_section() { super( "Improve homes config", - move("teleport.teleportedToLastLocation", "back.teleportedToLastLocation"), - move("teleport.teleportedSpecifiedPlayerLastLocation", "back.teleportedSpecifiedPlayerLastLocation"), - move("teleport.lastLocationNoExist", "back.lastLocationNoExist") + move("teleport.teleportedToLastLocation", "back.teleportedToLastTeleportLocation"), + move("teleport.teleportedSpecifiedPlayerLastLocation", "back.teleportedOtherToLastTeleportLocation"), + move("teleport.lastLocationNoExist", "back.lastLocationNotFound") ); } } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/migrations/Migrations.java b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/migrations/Migrations.java index 801a7d052..3bbd1dcef 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/migrations/Migrations.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/migrations/Migrations.java @@ -17,5 +17,6 @@ public class Migrations { new Migration_0012_Move_repair_argument_messages_to_dedicated_section(), new Migration_0013_Move_enchant_messages_to_dedicated_section(), new Migration_0014_Move_butcher_messages_to_dedicated_section(), + new Migration_0030_Move_back_to_dedicated_section() }; } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackCommand.java index f6ed7f624..9f0e4ea47 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackCommand.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackCommand.java @@ -1,7 +1,7 @@ package com.eternalcode.core.feature.back; import com.eternalcode.annotations.scan.command.DescriptionDocs; -import com.eternalcode.core.feature.back.BackService.BackLocation; +import com.eternalcode.commons.bukkit.position.PositionAdapter; import com.eternalcode.core.injector.annotations.Inject; import com.eternalcode.core.notice.NoticeService; import com.eternalcode.core.viewer.Viewer; @@ -9,10 +9,9 @@ import dev.rollczi.litecommands.annotations.command.Command; import dev.rollczi.litecommands.annotations.context.Sender; import dev.rollczi.litecommands.annotations.execute.Execute; +import dev.rollczi.litecommands.annotations.execute.ExecuteDefault; import dev.rollczi.litecommands.annotations.permission.Permission; -import java.util.Optional; import org.bukkit.entity.Player; -import panda.std.Pair; @Command(name = "back") public class BackCommand { @@ -26,56 +25,35 @@ public BackCommand(BackService backService, NoticeService noticeService) { this.noticeService = noticeService; } + @ExecuteDefault + @Permission("eternalcore.back.teleport") + void executeDefault(@Sender Player player) { + this.teleportBack(player); + } + @Execute(name = "death") @Permission("eternalcore.back.death") @DescriptionDocs(description = "Teleport to your last death location") public void executeBackDeath(@Sender Player player) { - Optional> backPair = this.backService.getBackLocationPair(player.getUniqueId()); - - if (backPair.isEmpty() || backPair.get().getFirst() == null) { - this.noticeService.player(player.getUniqueId(), translation -> translation.back().lastLocationNoExist()); - return; - } - - BackLocation deathLocation = backPair.get().getFirst(); - this.backService.teleportBack(player, deathLocation.location()); - this.noticeService.player(player.getUniqueId(), translation -> translation.back().teleportedToLastLocation()); + this.teleportBackDeath(player); } @Execute(name = "teleport") @Permission("eternalcore.back.teleport") @DescriptionDocs(description = "Teleport to your last teleport location") public void executeBackTeleport(@Sender Player player) { - Optional> backPair = this.backService.getBackLocationPair(player.getUniqueId()); - - if (backPair.isEmpty() || backPair.get().getSecond() == null) { - this.noticeService.player(player.getUniqueId(), translation -> translation.back().lastLocationNoExist()); - return; - } - - BackLocation teleportLocation = backPair.get().getSecond(); - this.backService.teleportBack(player, teleportLocation.location()); - this.noticeService.player(player.getUniqueId(), translation -> translation.back().teleportedToLastLocation()); + this.teleportBack(player); } @Execute(name = "death") @Permission("eternalcore.back.death.other") @DescriptionDocs(description = "Teleport specified player to their last death location", arguments = "") public void executeBackDeathOther(@Sender Viewer viewer, @Arg Player target) { - Optional> backPair = this.backService.getBackLocationPair(target.getUniqueId()); - - if (backPair.isEmpty() || backPair.get().getFirst() == null) { - this.noticeService.viewer(viewer, translation -> translation.back().lastLocationNoExist()); - return; - } - - BackLocation deathLocation = backPair.get().getFirst(); - this.backService.teleportBack(target, deathLocation.location()); - this.noticeService.player(target.getUniqueId(), translation -> translation.back().teleportedToLastLocation()); + this.teleportBackDeath(target); this.noticeService.create() .viewer(viewer) - .notice(translation -> translation.back().teleportedSpecifiedPlayerLastLocation()) + .notice(translation -> translation.back().teleportedOtherToLastDeathLocation()) .placeholder("{PLAYER}", target.getName()) .send(); } @@ -84,21 +62,28 @@ public void executeBackDeathOther(@Sender Viewer viewer, @Arg Player target) { @Permission("eternalcore.back.teleport.other") @DescriptionDocs(description = "Teleport specified player to their last teleport location", arguments = "") public void executeBackTeleportOther(@Sender Viewer viewer, @Arg Player target) { - Optional> backPair = this.backService.getBackLocationPair(target.getUniqueId()); - - if (backPair.isEmpty() || backPair.get().getSecond() == null) { - this.noticeService.viewer(viewer, translation -> translation.back().lastLocationNoExist()); - return; - } - - BackLocation teleportLocation = backPair.get().getSecond(); - this.backService.teleportBack(target, teleportLocation.location()); - this.noticeService.player(target.getUniqueId(), translation -> translation.back().teleportedToLastLocation()); + this.teleportBack(target); this.noticeService.create() .viewer(viewer) - .notice(translation -> translation.back().teleportedSpecifiedPlayerLastLocation()) + .notice(translation -> translation.back().teleportedOtherToLastTeleportLocation()) .placeholder("{PLAYER}", target.getName()) .send(); } + + private void teleportBack(Player player) { + this.backService.getTeleportLocation(player.getUniqueId()) + .ifPresentOrElse(position -> { + this.backService.teleportBack(player, PositionAdapter.convert(position)); + this.noticeService.player(player.getUniqueId(), translation -> translation.back().teleportedToLastTeleportLocation()); + }, () -> this.noticeService.player(player.getUniqueId(), translation -> translation.back().lastLocationNotFound())); + } + + private void teleportBackDeath(Player target) { + this.backService.getDeathLocation(target.getUniqueId()) + .ifPresentOrElse(deathPosition -> { + this.backService.teleportBack(target, PositionAdapter.convert(deathPosition)); + this.noticeService.player(target.getUniqueId(), translation -> translation.back().teleportedToLastDeathLocation()); + }, () -> this.noticeService.player(target.getUniqueId(), translation -> translation.back().lastLocationNotFound())); + } } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackController.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackController.java index a3dc1e008..b2eef717a 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackController.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackController.java @@ -1,5 +1,6 @@ package com.eternalcode.core.feature.back; +import com.eternalcode.commons.bukkit.position.PositionAdapter; import com.eternalcode.core.injector.annotations.Inject; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -21,7 +22,7 @@ public BackController(BackService backService) { public void onPlayerDeath(PlayerDeathEvent event) { Player entity = event.getEntity(); - this.backService.setBackLocation(entity.getUniqueId(), entity.getLocation(), true); + this.backService.markDeathLocation(entity.getUniqueId(), PositionAdapter.convert(entity.getLocation())); } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) @@ -30,6 +31,6 @@ public void onPlayerTeleport(PlayerTeleportEvent event) { return; } - this.backService.setBackLocation(event.getPlayer().getUniqueId(), event.getFrom(), false); + this.backService.markTeleportLocation(event.getPlayer().getUniqueId(), PositionAdapter.convert(event.getFrom())); } } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackService.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackService.java index 6c0b29999..4e0d2a599 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackService.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackService.java @@ -1,5 +1,6 @@ package com.eternalcode.core.feature.back; +import com.eternalcode.commons.bukkit.position.Position; import com.eternalcode.commons.bukkit.position.PositionAdapter; import com.eternalcode.core.feature.teleport.TeleportService; import com.eternalcode.core.feature.teleport.TeleportTaskService; @@ -13,16 +14,18 @@ import java.util.concurrent.TimeUnit; import org.bukkit.Location; import org.bukkit.entity.Player; -import panda.std.Pair; @Service public class BackService { + private static final String BYPASS_PERMISSION = "eternalcore.teleport.bypass"; + private final TeleportService teleportService; private final TeleportTaskService teleportTaskService; private final TeleportRequestSettings settings; - private final Cache> backLocationsCache; + private final Cache deathLocations; + private final Cache teleportLocations; @Inject public BackService( @@ -34,37 +37,36 @@ public BackService( this.teleportTaskService = teleportTaskService; this.settings = settings; - this.backLocationsCache = Caffeine.newBuilder() + this.deathLocations = Caffeine.newBuilder() + .maximumSize(1000) + .expireAfterWrite(2, TimeUnit.HOURS) + .build(); + this.teleportLocations = Caffeine.newBuilder() .maximumSize(1000) .expireAfterWrite(2, TimeUnit.HOURS) .build(); } - public Optional> getBackLocationPair(UUID playerId) { - return Optional.ofNullable(backLocationsCache.getIfPresent(playerId)); + public Optional getDeathLocation(UUID playerId) { + return Optional.ofNullable(deathLocations.getIfPresent(playerId)); } - public void setBackLocation(UUID playerId, Location location, boolean isFromDeath) { - Pair existing = backLocationsCache.getIfPresent(playerId); - BackLocation newLocation = new BackLocation(location); - BackLocation deathLocation; - BackLocation normalLocation; - if (existing == null) { - deathLocation = isFromDeath ? newLocation : null; - normalLocation = isFromDeath ? null : newLocation; - } - else { - deathLocation = isFromDeath ? newLocation : existing.getFirst(); - normalLocation = isFromDeath ? existing.getSecond() : newLocation; - } - backLocationsCache.put(playerId, Pair.of(deathLocation, normalLocation)); + public Optional getTeleportLocation(UUID playerId) { + return Optional.ofNullable(teleportLocations.getIfPresent(playerId)); + } + + public void markDeathLocation(UUID player, Position position) { + this.deathLocations.put(player, position); + } + + public void markTeleportLocation(UUID player, Position position) { + this.teleportLocations.put(player, position); } public void teleportBack(Player player, Location location) { - if (player.hasPermission("eternalcore.teleport.bypass")) { + if (player.hasPermission(BYPASS_PERMISSION)) { teleportService.teleport(player, location); - } - else { + } else { teleportTaskService.createTeleport( player.getUniqueId(), PositionAdapter.convert(player.getLocation()), @@ -73,7 +75,4 @@ public void teleportBack(Player player, Location location) { ); } } - - public record BackLocation(Location location) { - } } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/BackMessages.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/BackMessages.java index 5b0fecff3..788fdb2ee 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/BackMessages.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/BackMessages.java @@ -4,10 +4,14 @@ public interface BackMessages { - Notice lastLocationNoExist(); + Notice lastLocationNotFound(); - Notice teleportedToLastLocation(); + Notice teleportedToLastTeleportLocation(); - Notice teleportedSpecifiedPlayerLastLocation(); + Notice teleportedOtherToLastTeleportLocation(); + + Notice teleportedToLastDeathLocation(); + + Notice teleportedOtherToLastDeathLocation(); } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/ENBackMessages.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/ENBackMessages.java index 685ce339e..c941e1c0e 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/ENBackMessages.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/ENBackMessages.java @@ -9,8 +9,16 @@ @Accessors(fluent = true) public class ENBackMessages extends OkaeriConfig implements BackMessages { - public Notice lastLocationNoExist = Notice.chat("You don't have any last location to teleport to!"); - public Notice teleportedToLastLocation = Notice.chat("You have been teleported to your last location!"); - public Notice teleportedSpecifiedPlayerLastLocation = Notice.chat("Player {PLAYER} has been teleported to their last location!"); + public Notice lastLocationNotFound = Notice.chat( + "You don't have any last location to teleport to!"); + public Notice teleportedToLastTeleportLocation = Notice.chat( + "You have been teleported to your last location!"); + public Notice teleportedOtherToLastTeleportLocation = Notice.chat( + "Player {PLAYER} has been teleported to their last location!"); + + public Notice teleportedToLastDeathLocation = Notice.chat( + "You have been teleported to your last death location!"); + public Notice teleportedOtherToLastDeathLocation = Notice.chat( + "Player {PLAYER} has been teleported to their last death location!"); } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/PLBackMessages.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/PLBackMessages.java index 275dc1e0c..38526f6de 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/PLBackMessages.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/PLBackMessages.java @@ -9,8 +9,18 @@ @Accessors(fluent = true) public class PLBackMessages extends OkaeriConfig implements BackMessages { - public Notice lastLocationNoExist = Notice.chat("Nie masz żadnej ostatniej lokalizacji, do której można się teleportować!"); - public Notice teleportedToLastLocation = Notice.chat("Zostałeś przeteleportowany do ostatniej lokalizacji!"); - public Notice teleportedSpecifiedPlayerLastLocation = Notice.chat("Gracz {PLAYER} został przeteleportowany do swojej ostatniej lokalizacji!"); + public Notice lastLocationNotFound = Notice.chat( + "Nie masz żadnej ostatniej lokalizacji, do której można się teleportować!"); + + public Notice teleportedToLastTeleportLocation = Notice.chat( + "Zostałeś przeteleportowany do ostatniej lokalizacji!"); + public Notice teleportedOtherToLastTeleportLocation = Notice.chat( + "Gracz {PLAYER} został przeteleportowany do swojej ostatniej lokalizacji!"); + + public Notice teleportedToLastDeathLocation = Notice.chat( + "Zostałeś przeteleportowany do ostatniej lokalizacji śmierci!"); + + public Notice teleportedOtherToLastDeathLocation = Notice.chat( + "Gracz {PLAYER} został przeteleportowany do swojej ostatniej lokalizacji śmierci!"); } From 043f1901e8d7cc5ebaab6c77b38afce7c1d435f0 Mon Sep 17 00:00:00 2001 From: Jakubk15 <77227023+Jakubk15@users.noreply.github.com> Date: Sat, 11 Oct 2025 21:02:43 +0200 Subject: [PATCH 05/18] Document tpaTimer to also work for /back command --- .../eternalcode/core/feature/back/messages/PLBackMessages.java | 1 - .../core/feature/teleportrequest/TeleportRequestConfig.java | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/PLBackMessages.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/PLBackMessages.java index 38526f6de..75475839f 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/PLBackMessages.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/PLBackMessages.java @@ -22,5 +22,4 @@ public class PLBackMessages extends OkaeriConfig implements BackMessages { public Notice teleportedOtherToLastDeathLocation = Notice.chat( "Gracz {PLAYER} został przeteleportowany do swojej ostatniej lokalizacji śmierci!"); - } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/TeleportRequestConfig.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/TeleportRequestConfig.java index 2c2c27684..841019af2 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/TeleportRequestConfig.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/TeleportRequestConfig.java @@ -12,6 +12,6 @@ public class TeleportRequestConfig extends OkaeriConfig implements TeleportReque @Comment("# Time of tpa requests expire") public Duration tpaRequestExpire = Duration.ofSeconds(80); - @Comment("# Time of teleportation time in /tpa commands") + @Comment("# Time of teleportation time in /tpa commands. This is also used for /back command.") public Duration tpaTimer = Duration.ofSeconds(10); } From 98fc5f69809e1b22c0064d6f7cd449c47479f0ba Mon Sep 17 00:00:00 2001 From: Jakubk15 <77227023+Jakubk15@users.noreply.github.com> Date: Sat, 11 Oct 2025 21:06:07 +0200 Subject: [PATCH 06/18] Simplify if-else statement --- .../eternalcode/core/feature/back/BackService.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackService.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackService.java index 4e0d2a599..a3f909eda 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackService.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackService.java @@ -66,13 +66,13 @@ public void markTeleportLocation(UUID player, Position position) { public void teleportBack(Player player, Location location) { if (player.hasPermission(BYPASS_PERMISSION)) { teleportService.teleport(player, location); - } else { - teleportTaskService.createTeleport( - player.getUniqueId(), - PositionAdapter.convert(player.getLocation()), - PositionAdapter.convert(location), - settings.tpaTimer() - ); + return; } + teleportTaskService.createTeleport( + player.getUniqueId(), + PositionAdapter.convert(player.getLocation()), + PositionAdapter.convert(location), + settings.tpaTimer() + ); } } From ed16382734c373534cb8101c4f0776b54c8a8c36 Mon Sep 17 00:00:00 2001 From: Jakubk15 <77227023+Jakubk15@users.noreply.github.com> Date: Sat, 18 Oct 2025 16:39:00 +0200 Subject: [PATCH 07/18] Add missing comma --- .../eternalcode/core/configuration/migrations/Migrations.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/migrations/Migrations.java b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/migrations/Migrations.java index 0dc4eaf41..d38c56ca9 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/migrations/Migrations.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/migrations/Migrations.java @@ -18,7 +18,7 @@ public class Migrations { new Migration_0013_Move_enchant_messages_to_dedicated_section(), new Migration_0014_Move_butcher_messages_to_dedicated_section(), new Migration_0015_Move_ignore_messages_to_dedicated_section(), - new Migration_0030_Move_back_to_dedicated_section() + new Migration_0030_Move_back_to_dedicated_section(), new Migration_0031_Move_death_messages_to_dedicated_section(), new Migration_0032_Move_join_quit_messages_to_dedicated_section(), }; From 265a842f39bd821a50e4c6055b6f2f034cbeb7c5 Mon Sep 17 00:00:00 2001 From: Jakubk15 <77227023+Jakubk15@users.noreply.github.com> Date: Sat, 18 Oct 2025 17:46:21 +0200 Subject: [PATCH 08/18] wip --- .../core/feature/back/BackCommand.java | 62 ++++++++++++------- .../core/feature/back/BackService.java | 2 - .../feature/back/messages/BackMessages.java | 4 +- .../feature/back/messages/ENBackMessages.java | 4 +- .../feature/back/messages/PLBackMessages.java | 4 +- 5 files changed, 47 insertions(+), 29 deletions(-) diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackCommand.java index 9f0e4ea47..a5956cc24 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackCommand.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackCommand.java @@ -1,6 +1,7 @@ package com.eternalcode.core.feature.back; import com.eternalcode.annotations.scan.command.DescriptionDocs; +import com.eternalcode.commons.bukkit.position.Position; import com.eternalcode.commons.bukkit.position.PositionAdapter; import com.eternalcode.core.injector.annotations.Inject; import com.eternalcode.core.notice.NoticeService; @@ -11,6 +12,7 @@ import dev.rollczi.litecommands.annotations.execute.Execute; import dev.rollczi.litecommands.annotations.execute.ExecuteDefault; import dev.rollczi.litecommands.annotations.permission.Permission; +import java.util.Optional; import org.bukkit.entity.Player; @Command(name = "back") @@ -35,27 +37,39 @@ void executeDefault(@Sender Player player) { @Permission("eternalcore.back.death") @DescriptionDocs(description = "Teleport to your last death location") public void executeBackDeath(@Sender Player player) { - this.teleportBackDeath(player); + if (this.teleportBackDeath(player)) { + this.noticeService.player(player.getUniqueId(), translation -> translation.back().teleportedToLastDeathLocation()); + return; + } + this.noticeService.player(player.getUniqueId(), translation -> translation.back().lastLocationNotFound()); } @Execute(name = "teleport") @Permission("eternalcore.back.teleport") @DescriptionDocs(description = "Teleport to your last teleport location") public void executeBackTeleport(@Sender Player player) { - this.teleportBack(player); + if (this.teleportBack(player)) { + this.noticeService.player(player.getUniqueId(), translation -> translation.back().teleportedToLastTeleportLocation()); + return; + } + this.noticeService.player(player.getUniqueId(), translation -> translation.back().lastLocationNotFound()); } @Execute(name = "death") @Permission("eternalcore.back.death.other") @DescriptionDocs(description = "Teleport specified player to their last death location", arguments = "") public void executeBackDeathOther(@Sender Viewer viewer, @Arg Player target) { - this.teleportBackDeath(target); + if (this.teleportBackDeath(target)) { + this.noticeService.player(target.getUniqueId(), translation -> translation.back().teleportedToLastDeathLocation()); - this.noticeService.create() - .viewer(viewer) - .notice(translation -> translation.back().teleportedOtherToLastDeathLocation()) - .placeholder("{PLAYER}", target.getName()) - .send(); + this.noticeService.create() + .viewer(viewer) + .notice(translation -> translation.back().teleportedTargetToLastDeathLocation()) + .placeholder("{PLAYER}", target.getName()) + .send(); + return; + } + this.noticeService.player(viewer.getUniqueId(), translation -> translation.back().lastLocationNotFound()); } @Execute(name = "teleport") @@ -66,24 +80,30 @@ public void executeBackTeleportOther(@Sender Viewer viewer, @Arg Player target) this.noticeService.create() .viewer(viewer) - .notice(translation -> translation.back().teleportedOtherToLastTeleportLocation()) + .notice(translation -> translation.back().teleportedTargetToLastTeleportLocation()) .placeholder("{PLAYER}", target.getName()) .send(); } - private void teleportBack(Player player) { - this.backService.getTeleportLocation(player.getUniqueId()) - .ifPresentOrElse(position -> { - this.backService.teleportBack(player, PositionAdapter.convert(position)); - this.noticeService.player(player.getUniqueId(), translation -> translation.back().teleportedToLastTeleportLocation()); - }, () -> this.noticeService.player(player.getUniqueId(), translation -> translation.back().lastLocationNotFound())); + private boolean teleportBack(Player target) { + Optional teleportLocation = this.backService.getTeleportLocation(target.getUniqueId()); + + if (teleportLocation.isPresent()) { + this.backService.teleportBack(target, PositionAdapter.convert(teleportLocation.get())); + + return true; + } + return false; } - private void teleportBackDeath(Player target) { - this.backService.getDeathLocation(target.getUniqueId()) - .ifPresentOrElse(deathPosition -> { - this.backService.teleportBack(target, PositionAdapter.convert(deathPosition)); - this.noticeService.player(target.getUniqueId(), translation -> translation.back().teleportedToLastDeathLocation()); - }, () -> this.noticeService.player(target.getUniqueId(), translation -> translation.back().lastLocationNotFound())); + private boolean teleportBackDeath(Player target) { + Optional deathLocation = this.backService.getDeathLocation(target.getUniqueId()); + + if (deathLocation.isPresent()) { + this.backService.teleportBack(target, PositionAdapter.convert(deathLocation.get())); + + return true; + } + return false; } } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackService.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackService.java index a3f909eda..e277ebfe9 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackService.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackService.java @@ -38,11 +38,9 @@ public BackService( this.settings = settings; this.deathLocations = Caffeine.newBuilder() - .maximumSize(1000) .expireAfterWrite(2, TimeUnit.HOURS) .build(); this.teleportLocations = Caffeine.newBuilder() - .maximumSize(1000) .expireAfterWrite(2, TimeUnit.HOURS) .build(); } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/BackMessages.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/BackMessages.java index 788fdb2ee..d0fbc4950 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/BackMessages.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/BackMessages.java @@ -8,10 +8,10 @@ public interface BackMessages { Notice teleportedToLastTeleportLocation(); - Notice teleportedOtherToLastTeleportLocation(); + Notice teleportedTargetToLastTeleportLocation(); Notice teleportedToLastDeathLocation(); - Notice teleportedOtherToLastDeathLocation(); + Notice teleportedTargetToLastDeathLocation(); } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/ENBackMessages.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/ENBackMessages.java index c941e1c0e..652fd85f7 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/ENBackMessages.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/ENBackMessages.java @@ -14,11 +14,11 @@ public class ENBackMessages extends OkaeriConfig implements BackMessages { public Notice teleportedToLastTeleportLocation = Notice.chat( "You have been teleported to your last location!"); - public Notice teleportedOtherToLastTeleportLocation = Notice.chat( + public Notice teleportedTargetToLastTeleportLocation = Notice.chat( "Player {PLAYER} has been teleported to their last location!"); public Notice teleportedToLastDeathLocation = Notice.chat( "You have been teleported to your last death location!"); - public Notice teleportedOtherToLastDeathLocation = Notice.chat( + public Notice teleportedTargetToLastDeathLocation = Notice.chat( "Player {PLAYER} has been teleported to their last death location!"); } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/PLBackMessages.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/PLBackMessages.java index 75475839f..71f390d38 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/PLBackMessages.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/PLBackMessages.java @@ -14,12 +14,12 @@ public class PLBackMessages extends OkaeriConfig implements BackMessages { public Notice teleportedToLastTeleportLocation = Notice.chat( "Zostałeś przeteleportowany do ostatniej lokalizacji!"); - public Notice teleportedOtherToLastTeleportLocation = Notice.chat( + public Notice teleportedTargetToLastTeleportLocation = Notice.chat( "Gracz {PLAYER} został przeteleportowany do swojej ostatniej lokalizacji!"); public Notice teleportedToLastDeathLocation = Notice.chat( "Zostałeś przeteleportowany do ostatniej lokalizacji śmierci!"); - public Notice teleportedOtherToLastDeathLocation = Notice.chat( + public Notice teleportedTargetToLastDeathLocation = Notice.chat( "Gracz {PLAYER} został przeteleportowany do swojej ostatniej lokalizacji śmierci!"); } From cc42f2dbc55c793abf5faacc2e6c06867aecb65d Mon Sep 17 00:00:00 2001 From: Jakubk15 <77227023+Jakubk15@users.noreply.github.com> Date: Sat, 18 Oct 2025 17:53:07 +0200 Subject: [PATCH 09/18] Update messages --- ...n_0030_Move_back_to_dedicated_section.java | 2 +- .../core/feature/back/BackCommand.java | 45 +++++++++---------- .../feature/back/messages/BackMessages.java | 10 +++-- .../feature/back/messages/ENBackMessages.java | 8 +++- .../feature/back/messages/PLBackMessages.java | 10 +++-- 5 files changed, 42 insertions(+), 33 deletions(-) diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/migrations/Migration_0030_Move_back_to_dedicated_section.java b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/migrations/Migration_0030_Move_back_to_dedicated_section.java index 72cda251c..d39bdf997 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/migrations/Migration_0030_Move_back_to_dedicated_section.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/migrations/Migration_0030_Move_back_to_dedicated_section.java @@ -9,7 +9,7 @@ public class Migration_0030_Move_back_to_dedicated_section extends NamedMigratio super( "Improve homes config", move("teleport.teleportedToLastLocation", "back.teleportedToLastTeleportLocation"), - move("teleport.teleportedSpecifiedPlayerLastLocation", "back.teleportedOtherToLastTeleportLocation"), + move("teleport.teleportedSpecifiedPlayerLastLocation", "back.teleportedTargetPlayerToLastTeleportLocation"), move("teleport.lastLocationNoExist", "back.lastLocationNotFound") ); } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackCommand.java index a5956cc24..5faed9a5c 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackCommand.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackCommand.java @@ -28,9 +28,15 @@ public BackCommand(BackService backService, NoticeService noticeService) { } @ExecuteDefault + @Execute(name = "teleport") @Permission("eternalcore.back.teleport") - void executeDefault(@Sender Player player) { - this.teleportBack(player); + @DescriptionDocs(description = "Teleport to your last teleport location") + public void executeBackTeleport(@Sender Player player) { + if (this.teleportBack(player)) { + this.noticeService.player(player.getUniqueId(), translation -> translation.back().teleportedToLastTeleportLocation()); + return; + } + this.noticeService.player(player.getUniqueId(), translation -> translation.back().lastLocationNotFound()); } @Execute(name = "death") @@ -45,14 +51,20 @@ public void executeBackDeath(@Sender Player player) { } @Execute(name = "teleport") - @Permission("eternalcore.back.teleport") - @DescriptionDocs(description = "Teleport to your last teleport location") - public void executeBackTeleport(@Sender Player player) { - if (this.teleportBack(player)) { - this.noticeService.player(player.getUniqueId(), translation -> translation.back().teleportedToLastTeleportLocation()); + @Permission("eternalcore.back.teleport.other") + @DescriptionDocs(description = "Teleport specified player to their last teleport location", arguments = "") + public void executeBackTeleportOther(@Sender Viewer viewer, @Arg Player target) { + if (this.teleportBack(target)) { + this.noticeService.player(target.getUniqueId(), translation -> translation.back().teleportedToLastTeleportLocationByAdmin()); + + this.noticeService.create() + .viewer(viewer) + .notice(translation -> translation.back().teleportedTargetPlayerToLastTeleportLocation()) + .placeholder("{PLAYER}", target.getName()) + .send(); return; } - this.noticeService.player(player.getUniqueId(), translation -> translation.back().lastLocationNotFound()); + this.noticeService.player(viewer.getUniqueId(), translation -> translation.back().lastLocationNotFound()); } @Execute(name = "death") @@ -60,11 +72,11 @@ public void executeBackTeleport(@Sender Player player) { @DescriptionDocs(description = "Teleport specified player to their last death location", arguments = "") public void executeBackDeathOther(@Sender Viewer viewer, @Arg Player target) { if (this.teleportBackDeath(target)) { - this.noticeService.player(target.getUniqueId(), translation -> translation.back().teleportedToLastDeathLocation()); + this.noticeService.player(target.getUniqueId(), translation -> translation.back().teleportedToLastDeathLocationByAdmin()); this.noticeService.create() .viewer(viewer) - .notice(translation -> translation.back().teleportedTargetToLastDeathLocation()) + .notice(translation -> translation.back().teleportedTargetPlayerToLastDeathLocation()) .placeholder("{PLAYER}", target.getName()) .send(); return; @@ -72,19 +84,6 @@ public void executeBackDeathOther(@Sender Viewer viewer, @Arg Player target) { this.noticeService.player(viewer.getUniqueId(), translation -> translation.back().lastLocationNotFound()); } - @Execute(name = "teleport") - @Permission("eternalcore.back.teleport.other") - @DescriptionDocs(description = "Teleport specified player to their last teleport location", arguments = "") - public void executeBackTeleportOther(@Sender Viewer viewer, @Arg Player target) { - this.teleportBack(target); - - this.noticeService.create() - .viewer(viewer) - .notice(translation -> translation.back().teleportedTargetToLastTeleportLocation()) - .placeholder("{PLAYER}", target.getName()) - .send(); - } - private boolean teleportBack(Player target) { Optional teleportLocation = this.backService.getTeleportLocation(target.getUniqueId()); diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/BackMessages.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/BackMessages.java index d0fbc4950..884dcb67a 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/BackMessages.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/BackMessages.java @@ -6,12 +6,14 @@ public interface BackMessages { Notice lastLocationNotFound(); + // Teleport do ostatniej lokalizacji teleportacji Notice teleportedToLastTeleportLocation(); + Notice teleportedTargetPlayerToLastTeleportLocation(); + Notice teleportedToLastTeleportLocationByAdmin(); - Notice teleportedTargetToLastTeleportLocation(); - + // Teleport do ostatniej lokalizacji śmierci Notice teleportedToLastDeathLocation(); - - Notice teleportedTargetToLastDeathLocation(); + Notice teleportedTargetPlayerToLastDeathLocation(); + Notice teleportedToLastDeathLocationByAdmin(); } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/ENBackMessages.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/ENBackMessages.java index 652fd85f7..d774d3dce 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/ENBackMessages.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/ENBackMessages.java @@ -14,11 +14,15 @@ public class ENBackMessages extends OkaeriConfig implements BackMessages { public Notice teleportedToLastTeleportLocation = Notice.chat( "You have been teleported to your last location!"); - public Notice teleportedTargetToLastTeleportLocation = Notice.chat( + public Notice teleportedTargetPlayerToLastTeleportLocation = Notice.chat( "Player {PLAYER} has been teleported to their last location!"); + public Notice teleportedToLastTeleportLocationByAdmin = Notice.chat( + "You have been teleported to your last location by an administrator!"); public Notice teleportedToLastDeathLocation = Notice.chat( "You have been teleported to your last death location!"); - public Notice teleportedTargetToLastDeathLocation = Notice.chat( + public Notice teleportedTargetPlayerToLastDeathLocation = Notice.chat( "Player {PLAYER} has been teleported to their last death location!"); + public Notice teleportedToLastDeathLocationByAdmin = Notice.chat( + "You have been teleported to your last death location by an administrator!"); } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/PLBackMessages.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/PLBackMessages.java index 71f390d38..7db9bc8f8 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/PLBackMessages.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/PLBackMessages.java @@ -14,12 +14,16 @@ public class PLBackMessages extends OkaeriConfig implements BackMessages { public Notice teleportedToLastTeleportLocation = Notice.chat( "Zostałeś przeteleportowany do ostatniej lokalizacji!"); - public Notice teleportedTargetToLastTeleportLocation = Notice.chat( + public Notice teleportedTargetPlayerToLastTeleportLocation = Notice.chat( "Gracz {PLAYER} został przeteleportowany do swojej ostatniej lokalizacji!"); + public Notice teleportedToLastTeleportLocationByAdmin = Notice.chat( + "Zostałeś przeteleportowany do ostatniej lokalizacji przez administratora!"); public Notice teleportedToLastDeathLocation = Notice.chat( "Zostałeś przeteleportowany do ostatniej lokalizacji śmierci!"); - - public Notice teleportedTargetToLastDeathLocation = Notice.chat( + public Notice teleportedTargetPlayerToLastDeathLocation = Notice.chat( "Gracz {PLAYER} został przeteleportowany do swojej ostatniej lokalizacji śmierci!"); + public Notice teleportedToLastDeathLocationByAdmin = Notice.chat( + "Zostałeś przeteleportowany do ostatniej lokalizacji śmierci przez administratora!"); + } From 75ea7fdceaa746024f2fcdb49ae44d135de86e0f Mon Sep 17 00:00:00 2001 From: Jakubk15 <77227023+Jakubk15@users.noreply.github.com> Date: Fri, 24 Oct 2025 20:23:15 +0200 Subject: [PATCH 10/18] Adjust to others' suggestions (WIP) --- .../implementation/PluginConfiguration.java | 10 +++++++-- ...n_0030_Move_back_to_dedicated_section.java | 2 +- .../core/feature/back/BackCommand.java | 16 ++++++++++++-- .../core/feature/back/BackConfig.java | 14 ++++++++++++ .../core/feature/back/BackService.java | 22 +++++++++++++------ .../core/feature/back/BackSettings.java | 10 +++++++++ .../feature/back/messages/BackMessages.java | 2 -- .../TeleportRequestConfig.java | 2 +- 8 files changed, 63 insertions(+), 15 deletions(-) create mode 100644 eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackConfig.java create mode 100644 eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackSettings.java diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/implementation/PluginConfiguration.java b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/implementation/PluginConfiguration.java index 3dd6c217b..d1a1dfe9b 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/implementation/PluginConfiguration.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/implementation/PluginConfiguration.java @@ -7,6 +7,8 @@ import com.eternalcode.core.feature.afk.AfkSettings; import com.eternalcode.core.feature.automessage.AutoMessageConfig; import com.eternalcode.core.feature.automessage.AutoMessageSettings; +import com.eternalcode.core.feature.back.BackConfig; +import com.eternalcode.core.feature.back.BackSettings; import com.eternalcode.core.feature.broadcast.BroadcastConfig; import com.eternalcode.core.feature.broadcast.BroadcastSettings; import com.eternalcode.core.feature.butcher.ButcherConfig; @@ -50,8 +52,6 @@ import eu.okaeri.configs.OkaeriConfig; import eu.okaeri.configs.annotation.Comment; import eu.okaeri.configs.annotation.Header; -import org.bukkit.Sound; - import java.io.File; @Header({ @@ -213,6 +213,12 @@ public static class Format extends OkaeriConfig { @Comment("# Settings responsible for player vanish functionality") VanishConfig vanish = new VanishConfig(); + @Bean(proxied = BackSettings.class) + @Comment("") + @Comment("# Back Configuration") + @Comment("# Settings for the /back command functionality") + BackSettings back = new BackConfig(); + @Override public File getConfigFile(File dataFolder) { return new File(dataFolder, "config.yml"); diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/migrations/Migration_0030_Move_back_to_dedicated_section.java b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/migrations/Migration_0030_Move_back_to_dedicated_section.java index d39bdf997..2f4a70c62 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/migrations/Migration_0030_Move_back_to_dedicated_section.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/migrations/Migration_0030_Move_back_to_dedicated_section.java @@ -7,7 +7,7 @@ public class Migration_0030_Move_back_to_dedicated_section extends NamedMigration { Migration_0030_Move_back_to_dedicated_section() { super( - "Improve homes config", + "Move back to dedicated section", move("teleport.teleportedToLastLocation", "back.teleportedToLastTeleportLocation"), move("teleport.teleportedSpecifiedPlayerLastLocation", "back.teleportedTargetPlayerToLastTeleportLocation"), move("teleport.lastLocationNoExist", "back.lastLocationNotFound") diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackCommand.java index 5faed9a5c..cb3d43e35 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackCommand.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackCommand.java @@ -10,7 +10,6 @@ import dev.rollczi.litecommands.annotations.command.Command; import dev.rollczi.litecommands.annotations.context.Sender; import dev.rollczi.litecommands.annotations.execute.Execute; -import dev.rollczi.litecommands.annotations.execute.ExecuteDefault; import dev.rollczi.litecommands.annotations.permission.Permission; import java.util.Optional; import org.bukkit.entity.Player; @@ -27,7 +26,20 @@ public BackCommand(BackService backService, NoticeService noticeService) { this.noticeService = noticeService; } - @ExecuteDefault + + @Execute + @DescriptionDocs(description = "Teleport to your last teleport/death location, depending which one is most recent") + public void executeBack(@Sender Player player) { + Optional latestPositionOptional = this.backService.getLatestLocation(player.getUniqueId()); + if (latestPositionOptional.isEmpty()) { + return; + } + Position latestPosition = latestPositionOptional.get(); + + + } + + @Execute(name = "teleport") @Permission("eternalcore.back.teleport") @DescriptionDocs(description = "Teleport to your last teleport location") diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackConfig.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackConfig.java new file mode 100644 index 000000000..eb29a779e --- /dev/null +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackConfig.java @@ -0,0 +1,14 @@ +package com.eternalcode.core.feature.back; + +import eu.okaeri.configs.OkaeriConfig; +import java.time.Duration; +import lombok.Getter; +import lombok.experimental.Accessors; + +@Getter +@Accessors(fluent = true) +public class BackConfig extends OkaeriConfig implements BackSettings { + + public Duration backTeleportTimer = Duration.ofSeconds(5); + public Duration backLocationCacheDuration = Duration.ofHours(1); +} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackService.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackService.java index e277ebfe9..e148d7252 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackService.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackService.java @@ -4,14 +4,12 @@ import com.eternalcode.commons.bukkit.position.PositionAdapter; import com.eternalcode.core.feature.teleport.TeleportService; import com.eternalcode.core.feature.teleport.TeleportTaskService; -import com.eternalcode.core.feature.teleportrequest.TeleportRequestSettings; import com.eternalcode.core.injector.annotations.Inject; import com.eternalcode.core.injector.annotations.component.Service; import com.github.benmanes.caffeine.cache.Cache; import com.github.benmanes.caffeine.cache.Caffeine; import java.util.Optional; import java.util.UUID; -import java.util.concurrent.TimeUnit; import org.bukkit.Location; import org.bukkit.entity.Player; @@ -22,26 +20,30 @@ public class BackService { private final TeleportService teleportService; private final TeleportTaskService teleportTaskService; - private final TeleportRequestSettings settings; + private final BackSettings settings; private final Cache deathLocations; private final Cache teleportLocations; + private final Cache latestLocations; @Inject public BackService( TeleportService teleportService, TeleportTaskService teleportTaskService, - TeleportRequestSettings settings + BackSettings settings ) { this.teleportService = teleportService; this.teleportTaskService = teleportTaskService; this.settings = settings; this.deathLocations = Caffeine.newBuilder() - .expireAfterWrite(2, TimeUnit.HOURS) + .expireAfterWrite(settings.backLocationCacheDuration()) .build(); this.teleportLocations = Caffeine.newBuilder() - .expireAfterWrite(2, TimeUnit.HOURS) + .expireAfterWrite(settings.backLocationCacheDuration()) + .build(); + this.latestLocations = Caffeine.newBuilder() + .expireAfterWrite(settings.backLocationCacheDuration()) .build(); } @@ -53,12 +55,18 @@ public Optional getTeleportLocation(UUID playerId) { return Optional.ofNullable(teleportLocations.getIfPresent(playerId)); } + public Optional getLatestLocation(UUID playerId) { + return Optional.ofNullable(latestLocations.getIfPresent(playerId)); + } + public void markDeathLocation(UUID player, Position position) { this.deathLocations.put(player, position); + this.latestLocations.put(player, position); } public void markTeleportLocation(UUID player, Position position) { this.teleportLocations.put(player, position); + this.latestLocations.put(player, position); } public void teleportBack(Player player, Location location) { @@ -70,7 +78,7 @@ public void teleportBack(Player player, Location location) { player.getUniqueId(), PositionAdapter.convert(player.getLocation()), PositionAdapter.convert(location), - settings.tpaTimer() + settings.backTeleportTimer() ); } } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackSettings.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackSettings.java new file mode 100644 index 000000000..91dad028a --- /dev/null +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackSettings.java @@ -0,0 +1,10 @@ +package com.eternalcode.core.feature.back; + +import java.time.Duration; + +public interface BackSettings { + + Duration backTeleportTimer(); + + Duration backLocationCacheDuration(); +} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/BackMessages.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/BackMessages.java index 884dcb67a..be08f097c 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/BackMessages.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/messages/BackMessages.java @@ -6,12 +6,10 @@ public interface BackMessages { Notice lastLocationNotFound(); - // Teleport do ostatniej lokalizacji teleportacji Notice teleportedToLastTeleportLocation(); Notice teleportedTargetPlayerToLastTeleportLocation(); Notice teleportedToLastTeleportLocationByAdmin(); - // Teleport do ostatniej lokalizacji śmierci Notice teleportedToLastDeathLocation(); Notice teleportedTargetPlayerToLastDeathLocation(); Notice teleportedToLastDeathLocationByAdmin(); diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/TeleportRequestConfig.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/TeleportRequestConfig.java index 841019af2..344340cc0 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/TeleportRequestConfig.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/TeleportRequestConfig.java @@ -12,6 +12,6 @@ public class TeleportRequestConfig extends OkaeriConfig implements TeleportReque @Comment("# Time of tpa requests expire") public Duration tpaRequestExpire = Duration.ofSeconds(80); - @Comment("# Time of teleportation time in /tpa commands. This is also used for /back command.") + @Comment("# Time of teleportation time in /tpa commands.") public Duration tpaTimer = Duration.ofSeconds(10); } From 738ee16cbde6e25b33078546c0e8c50016b7af33 Mon Sep 17 00:00:00 2001 From: Jakubk15 <77227023+Jakubk15@users.noreply.github.com> Date: Fri, 24 Oct 2025 20:24:12 +0200 Subject: [PATCH 11/18] Remove unused imports --- .../core/translation/implementation/ENTranslation.java | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/translation/implementation/ENTranslation.java b/eternalcore-core/src/main/java/com/eternalcode/core/translation/implementation/ENTranslation.java index 8edac688c..669e633d5 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/translation/implementation/ENTranslation.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/translation/implementation/ENTranslation.java @@ -1,16 +1,9 @@ package com.eternalcode.core.translation.implementation; -import com.eternalcode.core.feature.back.messages.ENBackMessages; -import com.eternalcode.core.feature.freeze.messages.ENFreezeMessages; -import com.eternalcode.core.feature.playtime.messages.ENPlaytimeMessages; -import com.eternalcode.core.feature.clear.messages.ENClearMessages; -import com.eternalcode.core.feature.container.messages.ENContainerMessages; -import com.eternalcode.core.feature.repair.messages.ENRepairMessages; -import com.eternalcode.core.litecommand.argument.messages.ENArgumentMessages; -import com.eternalcode.core.configuration.contextual.ConfigItem; import com.eternalcode.core.feature.adminchat.messages.ENAdminChatMessages; import com.eternalcode.core.feature.afk.messages.ENAfkMessages; import com.eternalcode.core.feature.automessage.messages.ENAutoMessageMessages; +import com.eternalcode.core.feature.back.messages.ENBackMessages; import com.eternalcode.core.feature.broadcast.messages.ENBroadcastMessages; import com.eternalcode.core.feature.burn.messages.ENBurnMessages; import com.eternalcode.core.feature.butcher.messages.ENButcherMessages; From 29b76e2a688a7a2a80873f03e7c127bed5fc5d68 Mon Sep 17 00:00:00 2001 From: Jakubk15 <77227023+Jakubk15@users.noreply.github.com> Date: Fri, 24 Oct 2025 20:33:09 +0200 Subject: [PATCH 12/18] Create a default executor for /back command --- .../com/eternalcode/core/feature/back/BackCommand.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackCommand.java index cb3d43e35..499b6304d 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackCommand.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackCommand.java @@ -35,8 +35,13 @@ public void executeBack(@Sender Player player) { return; } Position latestPosition = latestPositionOptional.get(); + Position deathPosition = this.backService.getDeathLocation(player.getUniqueId()).orElse(null); - + if (latestPosition.equals(deathPosition)) { + this.executeBackDeath(player); + return; + } + this.executeBackTeleport(player); } From 16362d601668a6832b195c76005e21a30e71f83b Mon Sep 17 00:00:00 2001 From: Jakubk15 <77227023+Jakubk15@users.noreply.github.com> Date: Sat, 25 Oct 2025 14:15:37 +0200 Subject: [PATCH 13/18] Add proper permission to BackCommand --- .../main/java/com/eternalcode/core/feature/back/BackCommand.java | 1 + 1 file changed, 1 insertion(+) diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackCommand.java index 499b6304d..fa66d9946 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackCommand.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackCommand.java @@ -28,6 +28,7 @@ public BackCommand(BackService backService, NoticeService noticeService) { @Execute + @Permission("eternalcore.back") @DescriptionDocs(description = "Teleport to your last teleport/death location, depending which one is most recent") public void executeBack(@Sender Player player) { Optional latestPositionOptional = this.backService.getLatestLocation(player.getUniqueId()); From 8f7ffa144500d9dca41bde9f3a668dbe4c05bc83 Mon Sep 17 00:00:00 2001 From: Jakubk15 <77227023+Jakubk15@users.noreply.github.com> Date: Sat, 25 Oct 2025 14:22:44 +0200 Subject: [PATCH 14/18] Reduce nesting level --- .../core/feature/back/BackCommand.java | 37 ++++++++++--------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackCommand.java index fa66d9946..4b538cbb2 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackCommand.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackCommand.java @@ -72,34 +72,35 @@ public void executeBackDeath(@Sender Player player) { @Permission("eternalcore.back.teleport.other") @DescriptionDocs(description = "Teleport specified player to their last teleport location", arguments = "") public void executeBackTeleportOther(@Sender Viewer viewer, @Arg Player target) { - if (this.teleportBack(target)) { - this.noticeService.player(target.getUniqueId(), translation -> translation.back().teleportedToLastTeleportLocationByAdmin()); - - this.noticeService.create() - .viewer(viewer) - .notice(translation -> translation.back().teleportedTargetPlayerToLastTeleportLocation()) - .placeholder("{PLAYER}", target.getName()) - .send(); + if (!this.teleportBack(target)) { + this.noticeService.player(viewer.getUniqueId(), translation -> translation.back().lastLocationNotFound()); return; } - this.noticeService.player(viewer.getUniqueId(), translation -> translation.back().lastLocationNotFound()); + + this.noticeService.player(target.getUniqueId(), translation -> translation.back().teleportedToLastTeleportLocationByAdmin()); + this.noticeService.create() + .viewer(viewer) + .notice(translation -> translation.back().teleportedTargetPlayerToLastTeleportLocation()) + .placeholder("{PLAYER}", target.getName()) + .send(); } @Execute(name = "death") @Permission("eternalcore.back.death.other") @DescriptionDocs(description = "Teleport specified player to their last death location", arguments = "") public void executeBackDeathOther(@Sender Viewer viewer, @Arg Player target) { - if (this.teleportBackDeath(target)) { - this.noticeService.player(target.getUniqueId(), translation -> translation.back().teleportedToLastDeathLocationByAdmin()); - - this.noticeService.create() - .viewer(viewer) - .notice(translation -> translation.back().teleportedTargetPlayerToLastDeathLocation()) - .placeholder("{PLAYER}", target.getName()) - .send(); + if (!this.teleportBackDeath(target)) { + this.noticeService.player(viewer.getUniqueId(), translation -> translation.back().lastLocationNotFound()); return; } - this.noticeService.player(viewer.getUniqueId(), translation -> translation.back().lastLocationNotFound()); + + this.noticeService.player(target.getUniqueId(), translation -> translation.back().teleportedToLastDeathLocationByAdmin()); + this.noticeService.create() + .viewer(viewer) + .notice(translation -> translation.back().teleportedTargetPlayerToLastDeathLocation()) + .placeholder("{PLAYER}", target.getName()) + .send(); + } private boolean teleportBack(Player target) { From 282c4bda2043dd5e58559e2ecd9c246335886e09 Mon Sep 17 00:00:00 2001 From: Jakubk15 <77227023+Jakubk15@users.noreply.github.com> Date: Sat, 25 Oct 2025 14:30:18 +0200 Subject: [PATCH 15/18] Properly send a message to player when teleporting back --- .../main/java/com/eternalcode/core/feature/back/BackCommand.java | 1 + 1 file changed, 1 insertion(+) diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackCommand.java index 4b538cbb2..ca0f78e2f 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackCommand.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackCommand.java @@ -33,6 +33,7 @@ public BackCommand(BackService backService, NoticeService noticeService) { public void executeBack(@Sender Player player) { Optional latestPositionOptional = this.backService.getLatestLocation(player.getUniqueId()); if (latestPositionOptional.isEmpty()) { + this.noticeService.player(player.getUniqueId(), translation -> translation.back().lastLocationNotFound()); return; } Position latestPosition = latestPositionOptional.get(); From b41d2d47d509e0020824aac672f06f2f1c98d1e8 Mon Sep 17 00:00:00 2001 From: Jakubk15 <77227023+Jakubk15@users.noreply.github.com> Date: Sat, 25 Oct 2025 14:40:14 +0200 Subject: [PATCH 16/18] Fix ClassCastException --- .../configuration/implementation/PluginConfiguration.java | 2 +- .../java/com/eternalcode/core/feature/back/BackConfig.java | 4 ++++ .../core/feature/randomteleport/RandomTeleportConfig.java | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/implementation/PluginConfiguration.java b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/implementation/PluginConfiguration.java index d1a1dfe9b..5c06ca8d1 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/configuration/implementation/PluginConfiguration.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/configuration/implementation/PluginConfiguration.java @@ -217,7 +217,7 @@ public static class Format extends OkaeriConfig { @Comment("") @Comment("# Back Configuration") @Comment("# Settings for the /back command functionality") - BackSettings back = new BackConfig(); + BackConfig back = new BackConfig(); @Override public File getConfigFile(File dataFolder) { diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackConfig.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackConfig.java index eb29a779e..73c5a6d95 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackConfig.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackConfig.java @@ -1,6 +1,7 @@ package com.eternalcode.core.feature.back; import eu.okaeri.configs.OkaeriConfig; +import eu.okaeri.configs.annotation.Comment; import java.time.Duration; import lombok.Getter; import lombok.experimental.Accessors; @@ -9,6 +10,9 @@ @Accessors(fluent = true) public class BackConfig extends OkaeriConfig implements BackSettings { + @Comment("# Time of teleportation time in /back command.") public Duration backTeleportTimer = Duration.ofSeconds(5); + + @Comment("# Duration of caching last locations for /back command.") public Duration backLocationCacheDuration = Duration.ofHours(1); } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/randomteleport/RandomTeleportConfig.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/randomteleport/RandomTeleportConfig.java index 1c175e6e5..fa8f18c7d 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/randomteleport/RandomTeleportConfig.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/randomteleport/RandomTeleportConfig.java @@ -47,7 +47,7 @@ public class RandomTeleportConfig extends OkaeriConfig implements RandomTeleport "# Leave empty (\"\") to use player's current world", "# Specify world name to always teleport to that world" }) - public String world = "world"; + public String world = "world_nether"; @Comment({ "# Maximum attempts to find a safe teleport location", From ecae120ca32a905d0d740393aa7f683602e3e515 Mon Sep 17 00:00:00 2001 From: Jakubk15 <77227023+Jakubk15@users.noreply.github.com> Date: Tue, 28 Oct 2025 20:05:42 +0100 Subject: [PATCH 17/18] Revert accidental world name change --- .../core/feature/randomteleport/RandomTeleportConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/randomteleport/RandomTeleportConfig.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/randomteleport/RandomTeleportConfig.java index fa8f18c7d..1c175e6e5 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/randomteleport/RandomTeleportConfig.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/randomteleport/RandomTeleportConfig.java @@ -47,7 +47,7 @@ public class RandomTeleportConfig extends OkaeriConfig implements RandomTeleport "# Leave empty (\"\") to use player's current world", "# Specify world name to always teleport to that world" }) - public String world = "world_nether"; + public String world = "world"; @Comment({ "# Maximum attempts to find a safe teleport location", From 52a5d8a0fc45329987ee2efcc0285b03984e90b3 Mon Sep 17 00:00:00 2001 From: Jakubk15 <77227023+Jakubk15@users.noreply.github.com> Date: Tue, 28 Oct 2025 20:13:56 +0100 Subject: [PATCH 18/18] Encapsulate classes --- .../core/feature/back/BackCommand.java | 33 +++---------------- .../core/feature/back/BackController.java | 6 ++-- .../core/feature/back/BackService.java | 28 ++++++++++++++-- 3 files changed, 34 insertions(+), 33 deletions(-) diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackCommand.java index ca0f78e2f..989e6bac0 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackCommand.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackCommand.java @@ -2,7 +2,6 @@ import com.eternalcode.annotations.scan.command.DescriptionDocs; import com.eternalcode.commons.bukkit.position.Position; -import com.eternalcode.commons.bukkit.position.PositionAdapter; import com.eternalcode.core.injector.annotations.Inject; import com.eternalcode.core.notice.NoticeService; import com.eternalcode.core.viewer.Viewer; @@ -15,7 +14,7 @@ import org.bukkit.entity.Player; @Command(name = "back") -public class BackCommand { +class BackCommand { private final BackService backService; private final NoticeService noticeService; @@ -51,7 +50,7 @@ public void executeBack(@Sender Player player) { @Permission("eternalcore.back.teleport") @DescriptionDocs(description = "Teleport to your last teleport location") public void executeBackTeleport(@Sender Player player) { - if (this.teleportBack(player)) { + if (this.backService.teleportBack(player)) { this.noticeService.player(player.getUniqueId(), translation -> translation.back().teleportedToLastTeleportLocation()); return; } @@ -62,7 +61,7 @@ public void executeBackTeleport(@Sender Player player) { @Permission("eternalcore.back.death") @DescriptionDocs(description = "Teleport to your last death location") public void executeBackDeath(@Sender Player player) { - if (this.teleportBackDeath(player)) { + if (this.backService.teleportBackDeath(player)) { this.noticeService.player(player.getUniqueId(), translation -> translation.back().teleportedToLastDeathLocation()); return; } @@ -73,7 +72,7 @@ public void executeBackDeath(@Sender Player player) { @Permission("eternalcore.back.teleport.other") @DescriptionDocs(description = "Teleport specified player to their last teleport location", arguments = "") public void executeBackTeleportOther(@Sender Viewer viewer, @Arg Player target) { - if (!this.teleportBack(target)) { + if (!this.backService.teleportBack(target)) { this.noticeService.player(viewer.getUniqueId(), translation -> translation.back().lastLocationNotFound()); return; } @@ -90,7 +89,7 @@ public void executeBackTeleportOther(@Sender Viewer viewer, @Arg Player target) @Permission("eternalcore.back.death.other") @DescriptionDocs(description = "Teleport specified player to their last death location", arguments = "") public void executeBackDeathOther(@Sender Viewer viewer, @Arg Player target) { - if (!this.teleportBackDeath(target)) { + if (!this.backService.teleportBackDeath(target)) { this.noticeService.player(viewer.getUniqueId(), translation -> translation.back().lastLocationNotFound()); return; } @@ -103,26 +102,4 @@ public void executeBackDeathOther(@Sender Viewer viewer, @Arg Player target) { .send(); } - - private boolean teleportBack(Player target) { - Optional teleportLocation = this.backService.getTeleportLocation(target.getUniqueId()); - - if (teleportLocation.isPresent()) { - this.backService.teleportBack(target, PositionAdapter.convert(teleportLocation.get())); - - return true; - } - return false; - } - - private boolean teleportBackDeath(Player target) { - Optional deathLocation = this.backService.getDeathLocation(target.getUniqueId()); - - if (deathLocation.isPresent()) { - this.backService.teleportBack(target, PositionAdapter.convert(deathLocation.get())); - - return true; - } - return false; - } } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackController.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackController.java index b2eef717a..7180efef4 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackController.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackController.java @@ -2,6 +2,7 @@ import com.eternalcode.commons.bukkit.position.PositionAdapter; import com.eternalcode.core.injector.annotations.Inject; +import com.eternalcode.core.injector.annotations.component.Controller; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -9,12 +10,13 @@ import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.player.PlayerTeleportEvent; -public class BackController implements Listener { +@Controller +class BackController implements Listener { private final BackService backService; @Inject - public BackController(BackService backService) { + BackController(BackService backService) { this.backService = backService; } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackService.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackService.java index e148d7252..51054829d 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackService.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/back/BackService.java @@ -14,7 +14,7 @@ import org.bukkit.entity.Player; @Service -public class BackService { +class BackService { private static final String BYPASS_PERMISSION = "eternalcore.teleport.bypass"; @@ -27,7 +27,7 @@ public class BackService { private final Cache latestLocations; @Inject - public BackService( + BackService( TeleportService teleportService, TeleportTaskService teleportTaskService, BackSettings settings @@ -69,7 +69,29 @@ public void markTeleportLocation(UUID player, Position position) { this.latestLocations.put(player, position); } - public void teleportBack(Player player, Location location) { + public boolean teleportBack(Player target) { + Optional teleportLocation = this.getTeleportLocation(target.getUniqueId()); + + if (teleportLocation.isPresent()) { + this.teleportBack(target, PositionAdapter.convert(teleportLocation.get())); + + return true; + } + return false; + } + + public boolean teleportBackDeath(Player target) { + Optional deathLocation = this.getDeathLocation(target.getUniqueId()); + + if (deathLocation.isPresent()) { + this.teleportBack(target, PositionAdapter.convert(deathLocation.get())); + + return true; + } + return false; + } + + private void teleportBack(Player player, Location location) { if (player.hasPermission(BYPASS_PERMISSION)) { teleportService.teleport(player, location); return;