diff --git a/src/main/java/org/mvplugins/multiverse/core/commands/TeleportCommand.java b/src/main/java/org/mvplugins/multiverse/core/commands/TeleportCommand.java index 8030c1792..6610431d2 100644 --- a/src/main/java/org/mvplugins/multiverse/core/commands/TeleportCommand.java +++ b/src/main/java/org/mvplugins/multiverse/core/commands/TeleportCommand.java @@ -105,7 +105,7 @@ private void teleportSinglePlayer(MVCommandIssuer issuer, Player player, .teleportSingle(player) .onSuccess(() -> issuer.sendInfo(MVCorei18n.TELEPORT_SUCCESS, Replace.PLAYER.with(getYouOrName(issuer, player)), - Replace.DESTINATION.with(destination.toString()))) + Replace.DESTINATION.with(destination.getDisplayMessage()))) .onFailureCount(reasonsCountMap -> { for (var entry : reasonsCountMap.entrySet()) { Logging.finer("Failed to teleport %s players to %s: %s", @@ -138,7 +138,7 @@ private void teleportMultiplePlayers(MVCommandIssuer issuer, Player[] players, .teleport(List.of(players)) .onSuccessCount(successCount -> issuer.sendInfo(MVCorei18n.TELEPORT_SUCCESS, Replace.PLAYER.with(successCount + " players"), - Replace.DESTINATION.with(destination.toString()))) + Replace.DESTINATION.with(destination.getDisplayMessage()))) .onFailureCount(reasonsCountMap -> { for (var entry : reasonsCountMap.entrySet()) { Logging.finer("Failed to teleport %s players to %s: %s", diff --git a/src/main/java/org/mvplugins/multiverse/core/destination/DestinationInstance.java b/src/main/java/org/mvplugins/multiverse/core/destination/DestinationInstance.java index e2c04ab7d..63d3d2d26 100644 --- a/src/main/java/org/mvplugins/multiverse/core/destination/DestinationInstance.java +++ b/src/main/java/org/mvplugins/multiverse/core/destination/DestinationInstance.java @@ -4,8 +4,9 @@ import org.bukkit.Location; import org.bukkit.entity.Entity; import org.bukkit.util.Vector; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; -import org.mvplugins.multiverse.core.utils.result.FailureReason; +import org.mvplugins.multiverse.core.locale.message.Message; import org.mvplugins.multiverse.core.world.location.UnloadedWorldLocation; /** @@ -79,6 +80,20 @@ protected DestinationInstance(@NotNull T destination) { */ public abstract @NotNull Option getFinerPermissionSuffix(); + /** + * Gets a user-friendly display text for this destination instance. This is used when displaying the destination + * to the player. By default, this returns the same as {@link #toString()}. Override this method to provide a more + * user-friendly display text with colors, formatting and localization support. + * + * @return The display message. + * @since 5.4 + */ + @ApiStatus.AvailableSince("5.4") + @NotNull + public Message getDisplayMessage() { + return Message.of(this.toString()); + } + /** * Serialises the destination instance to a savable string. * diff --git a/src/main/java/org/mvplugins/multiverse/core/destination/core/AnchorDestinationInstance.java b/src/main/java/org/mvplugins/multiverse/core/destination/core/AnchorDestinationInstance.java index 92b291426..806f2020c 100644 --- a/src/main/java/org/mvplugins/multiverse/core/destination/core/AnchorDestinationInstance.java +++ b/src/main/java/org/mvplugins/multiverse/core/destination/core/AnchorDestinationInstance.java @@ -7,6 +7,7 @@ import org.jetbrains.annotations.NotNull; import org.mvplugins.multiverse.core.destination.DestinationInstance; +import org.mvplugins.multiverse.core.locale.message.Message; /** * Destination instance implementation for the {@link AnchorDestination}. @@ -63,6 +64,15 @@ public boolean checkTeleportSafety() { return Option.of(anchorName); } + /** + * {@inheritDoc} + */ + @Override + public @NotNull Message getDisplayMessage() { + //TODO Localize + return Message.of("anchor '" + anchorName + "'"); + } + /** * {@inheritDoc} */ diff --git a/src/main/java/org/mvplugins/multiverse/core/destination/core/BedDestinationInstance.java b/src/main/java/org/mvplugins/multiverse/core/destination/core/BedDestinationInstance.java index 5516ac1ce..5144c9245 100644 --- a/src/main/java/org/mvplugins/multiverse/core/destination/core/BedDestinationInstance.java +++ b/src/main/java/org/mvplugins/multiverse/core/destination/core/BedDestinationInstance.java @@ -9,12 +9,13 @@ import org.jetbrains.annotations.Nullable; import org.mvplugins.multiverse.core.destination.DestinationInstance; +import org.mvplugins.multiverse.core.locale.message.Message; /** * Destination instance implementation for the {@link BedDestination}. */ public final class BedDestinationInstance extends DestinationInstance { - private final Player player; + private final @Nullable Player player; /** * Constructor. @@ -64,6 +65,15 @@ public boolean checkTeleportSafety() { return Option.of(player != null ? player.getName() : BedDestination.OWN_BED_STRING); } + /** + * {@inheritDoc} + */ + @Override + public @NotNull Message getDisplayMessage() { + //TODO Localize + return Message.of(player == null ? "your bed/respawn point" : player.getName() + "'s bed/respawn point"); + } + /** * {@inheritDoc} */ diff --git a/src/main/java/org/mvplugins/multiverse/core/destination/core/ExactDestination.java b/src/main/java/org/mvplugins/multiverse/core/destination/core/ExactDestination.java index c37969d05..ddc040f20 100644 --- a/src/main/java/org/mvplugins/multiverse/core/destination/core/ExactDestination.java +++ b/src/main/java/org/mvplugins/multiverse/core/destination/core/ExactDestination.java @@ -23,14 +23,11 @@ import org.mvplugins.multiverse.core.locale.MVCorei18n; import org.mvplugins.multiverse.core.utils.REPatterns; import org.mvplugins.multiverse.core.utils.position.EntityPosition; -import org.mvplugins.multiverse.core.utils.position.PositionNumber; -import org.mvplugins.multiverse.core.utils.position.VectorPosition; import org.mvplugins.multiverse.core.utils.result.Attempt; import org.mvplugins.multiverse.core.utils.result.FailureReason; import org.mvplugins.multiverse.core.world.LoadedMultiverseWorld; import org.mvplugins.multiverse.core.world.WorldManager; import org.mvplugins.multiverse.core.world.entrycheck.WorldEntryCheckerProvider; -import org.mvplugins.multiverse.core.world.location.UnloadedWorldLocation; import static org.mvplugins.multiverse.core.locale.message.MessageReplacement.*; @@ -68,6 +65,7 @@ public ExactDestination(CoreConfig config, WorldManager worldManager, WorldEntry public @NotNull ExactDestinationInstance fromLocation(@NotNull Location location) { return new ExactDestinationInstance( this, + worldManager, location.getWorld().getName(), EntityPosition.ofLocation(location) ); @@ -88,6 +86,7 @@ public ExactDestination(CoreConfig config, WorldManager worldManager, WorldEntry .map(location -> Attempt.success( new ExactDestinationInstance( this, + worldManager, location.getWorld().getName(), EntityPosition.ofLocation(location) ) @@ -112,7 +111,7 @@ public ExactDestination(CoreConfig config, WorldManager worldManager, WorldEntry return Attempt.failure(InstanceFailureReason.INVALID_NUMBER_FORMAT, Replace.ERROR.with(e)); } - return Attempt.success(new ExactDestinationInstance(this, worldName, position)); + return Attempt.success(new ExactDestinationInstance(this, worldManager, worldName, position)); } //TODO: Extract to a world finder class diff --git a/src/main/java/org/mvplugins/multiverse/core/destination/core/ExactDestinationInstance.java b/src/main/java/org/mvplugins/multiverse/core/destination/core/ExactDestinationInstance.java index 3eebadfd8..a5c08c81c 100644 --- a/src/main/java/org/mvplugins/multiverse/core/destination/core/ExactDestinationInstance.java +++ b/src/main/java/org/mvplugins/multiverse/core/destination/core/ExactDestinationInstance.java @@ -9,14 +9,16 @@ import org.jetbrains.annotations.NotNull; import org.mvplugins.multiverse.core.destination.DestinationInstance; +import org.mvplugins.multiverse.core.locale.message.Message; import org.mvplugins.multiverse.core.utils.position.EntityPosition; -import org.mvplugins.multiverse.core.utils.position.VectorPosition; -import org.mvplugins.multiverse.core.world.location.UnloadedWorldLocation; +import org.mvplugins.multiverse.core.world.MultiverseWorld; +import org.mvplugins.multiverse.core.world.WorldManager; /** * Destination instance implementation for the {@link ExactDestination}. */ public final class ExactDestinationInstance extends DestinationInstance { + private final WorldManager worldManager; private final String worldName; private final EntityPosition position; @@ -28,9 +30,11 @@ public final class ExactDestinationInstance extends DestinationInstance