Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@
registerAsyncCompletion("mvworlds", this::suggestMVWorlds);
registerAsyncCompletion("mvworldpropsname", this::suggestMVWorldPropsName);
registerAsyncCompletion("mvworldpropsvalue", this::suggestMVWorldPropsValue);
registerAsyncCompletion("playersarray", this::suggestPlayersArray);
registerCompletion("playersarray", this::suggestPlayersArray); // getting online players cannot be async

Check warning on line 103 in src/main/java/org/mvplugins/multiverse/core/command/MVCommandCompletions.java

View workflow job for this annotation

GitHub Actions / checkstyle / checkstyle

[checkstyle] reported by reviewdog 🐶 Don't use trailing comments. Raw Output: /github/workspace/./src/main/java/org/mvplugins/multiverse/core/command/MVCommandCompletions.java:103:72: warning: Don't use trailing comments. (com.puppycrawl.tools.checkstyle.checks.TrailingCommentCheck)
registerStaticCompletion("propsmodifyaction", suggestEnums(PropertyModifyAction.class));
registerStaticCompletion("spawncategories", suggestEnums(SpawnCategory.class));
registerAsyncCompletion("spawncategorypropsname", this::suggestSpawnCategoryPropsName);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

import co.aikar.locales.MessageKey;
import co.aikar.locales.MessageKeyProvider;
import org.bukkit.Bukkit;
import jakarta.inject.Inject;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
Expand All @@ -20,8 +20,7 @@
import org.mvplugins.multiverse.core.utils.PlayerFinder;
import org.mvplugins.multiverse.core.utils.result.Attempt;
import org.mvplugins.multiverse.core.utils.result.FailureReason;

import static org.mvplugins.multiverse.core.locale.message.MessageReplacement.replace;
import org.mvplugins.multiverse.core.world.helpers.ConcurrentPlayerWorldTracker;

/**
* {@link Destination} implementation for beds.
Expand All @@ -30,7 +29,11 @@
public final class BedDestination implements Destination<BedDestination, BedDestinationInstance, BedDestination.InstanceFailureReason> {
static final String OWN_BED_STRING = "playerbed";

BedDestination() {
private final ConcurrentPlayerWorldTracker worldTracker;

@Inject
BedDestination(@NotNull ConcurrentPlayerWorldTracker worldTracker) {
this.worldTracker = worldTracker;
}

/**
Expand Down Expand Up @@ -62,8 +65,8 @@ public final class BedDestination implements Destination<BedDestination, BedDest
@Override
public @NotNull Collection<DestinationSuggestionPacket> suggestDestinations(
@NotNull CommandSender sender, @Nullable String destinationParams) {
List<DestinationSuggestionPacket> collect = Bukkit.getOnlinePlayers().stream()
.map(player -> new DestinationSuggestionPacket(this, player.getName(), player.getName()))
List<DestinationSuggestionPacket> collect = worldTracker.getOnlinePlayers().stream()
.map(player -> new DestinationSuggestionPacket(this, player, player))
.collect(Collectors.toList());
if (sender instanceof Player) {
collect.add(new DestinationSuggestionPacket(this, OWN_BED_STRING, OWN_BED_STRING));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

import co.aikar.locales.MessageKey;
import co.aikar.locales.MessageKeyProvider;
import org.bukkit.Bukkit;
import jakarta.inject.Inject;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
Expand All @@ -14,21 +14,26 @@
import org.mvplugins.multiverse.core.destination.Destination;
import org.mvplugins.multiverse.core.destination.DestinationSuggestionPacket;
import org.mvplugins.multiverse.core.locale.MVCorei18n;
import org.mvplugins.multiverse.core.locale.message.MessageReplacement;
import org.mvplugins.multiverse.core.locale.message.MessageReplacement.Replace;
import org.mvplugins.multiverse.core.utils.PlayerFinder;
import org.mvplugins.multiverse.core.utils.result.Attempt;
import org.mvplugins.multiverse.core.utils.result.FailureReason;
import org.mvplugins.multiverse.core.world.helpers.ConcurrentPlayerWorldTracker;

/**
* {@link Destination} implementation for players.s
*/
@Service
public final class PlayerDestination implements Destination<PlayerDestination, PlayerDestinationInstance, PlayerDestination.InstanceFailureReason> {

private final ConcurrentPlayerWorldTracker playerWorldTracker;

/**
* Creates a new instance of the PlayerDestination.
*/
PlayerDestination() {
@Inject
PlayerDestination(@NotNull ConcurrentPlayerWorldTracker playerWorldTracker) {
this.playerWorldTracker = playerWorldTracker;
}

/**
Expand Down Expand Up @@ -60,8 +65,8 @@ public final class PlayerDestination implements Destination<PlayerDestination, P
@Override
public @NotNull Collection<DestinationSuggestionPacket> suggestDestinations(
@NotNull CommandSender sender, @Nullable String destinationParams) {
return Bukkit.getOnlinePlayers().stream()
.map(p -> new DestinationSuggestionPacket(this, p.getName(), p.getName()))
return playerWorldTracker.getOnlinePlayers().stream()
.map(player -> new DestinationSuggestionPacket(this, player, player))
.toList();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import org.mvplugins.multiverse.core.dynamiclistener.annotations.SkipIfEventExist;
import org.mvplugins.multiverse.core.utils.text.ChatTextFormatter;
import org.mvplugins.multiverse.core.world.WorldManager;
import org.mvplugins.multiverse.core.world.helpers.ConcurrentPlayerWorldTracker;

/**
* Multiverse's Listener for players.
Expand All @@ -24,16 +25,17 @@
final class MVChatListener implements CoreListener {
private final CoreConfig config;
private final WorldManager worldManager;
private final MVPlayerListener playerListener;
private final ConcurrentPlayerWorldTracker playerWorldTracker;

@Inject
MVChatListener(
CoreConfig config,
WorldManager worldManager,
MVPlayerListener playerListener) {
ConcurrentPlayerWorldTracker playerWorldTracker
) {

Check warning on line 35 in src/main/java/org/mvplugins/multiverse/core/listeners/MVChatListener.java

View workflow job for this annotation

GitHub Actions / checkstyle / checkstyle

[checkstyle] reported by reviewdog 🐶 ')' should be on the previous line. Raw Output: /github/workspace/./src/main/java/org/mvplugins/multiverse/core/listeners/MVChatListener.java:35:5: warning: ')' should be on the previous line. (SeparatorWrapEol)
this.config = config;
this.worldManager = worldManager;
this.playerListener = playerListener;
this.playerWorldTracker = playerWorldTracker;
}

@EventClass("io.papermc.paper.event.player.AsyncChatEvent")
Expand Down Expand Up @@ -94,12 +96,9 @@
}

private String getWorldName(Player player) {
String world = playerListener.getPlayerWorld().get(player.getName());
if (world == null) {
world = player.getWorld().getName();
playerListener.getPlayerWorld().put(player.getName(), world);
}
return this.worldManager.getLoadedWorld(world)
String worldName = playerWorldTracker.getPlayerWorld(player.getName())
.getOrElse(() -> player.getWorld().getName());
return this.worldManager.getLoadedWorld(worldName)
.map(mvworld -> mvworld.isHidden() ? "" : mvworld.getAliasOrName())
.getOrElse("");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,8 +73,6 @@ final class MVPlayerListener implements CoreListener {
private final DimensionFinder dimensionFinder;
private final CorePermissionsChecker corePermissionsChecker;

private final Map<String, String> playerWorld = new ConcurrentHashMap<>();

@Inject
MVPlayerListener(
MultiverseCore plugin,
Expand Down Expand Up @@ -117,15 +115,6 @@ private PluginLocales getLocales() {
return getCommandManager().getLocales();
}

/**
* Gets the map of player and the world name they are in.
*
* @return the playerWorld-map
*/
Map<String, String> getPlayerWorld() {
return playerWorld;
}

/**
* This method is called when a player respawns.
*
Expand Down Expand Up @@ -274,7 +263,6 @@ private void handleJoinLocation(PlayerSpawnLocationEvent event) {
void playerChangedWorld(PlayerChangedWorldEvent event) {
// Permissions now determine whether or not to handle a gamemode.
this.handleGameModeAndFlight(event.getPlayer(), event.getPlayer().getWorld());
playerWorld.put(event.getPlayer().getName(), event.getPlayer().getWorld().getName());
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
package org.mvplugins.multiverse.core.world.helpers;

import io.vavr.control.Option;
import jakarta.inject.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.player.PlayerChangedWorldEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.UnmodifiableView;
import org.jvnet.hk2.annotations.Service;
import org.mvplugins.multiverse.core.MultiverseCore;

Check warning on line 16 in src/main/java/org/mvplugins/multiverse/core/world/helpers/ConcurrentPlayerWorldTracker.java

View workflow job for this annotation

GitHub Actions / checkstyle / checkstyle

[checkstyle] reported by reviewdog 🐶 'org.mvplugins.multiverse.core.MultiverseCore' should be separated from previous imports. Raw Output: /github/workspace/./src/main/java/org/mvplugins/multiverse/core/world/helpers/ConcurrentPlayerWorldTracker.java:16:1: warning: 'org.mvplugins.multiverse.core.MultiverseCore' should be separated from previous imports. (com.puppycrawl.tools.checkstyle.checks.imports.ImportOrderCheck)

import java.util.Collection;

Check warning on line 18 in src/main/java/org/mvplugins/multiverse/core/world/helpers/ConcurrentPlayerWorldTracker.java

View workflow job for this annotation

GitHub Actions / checkstyle / checkstyle

[checkstyle] reported by reviewdog 🐶 Wrong order for 'java.util.Collection' import. Raw Output: /github/workspace/./src/main/java/org/mvplugins/multiverse/core/world/helpers/ConcurrentPlayerWorldTracker.java:18:1: warning: Wrong order for 'java.util.Collection' import. (com.puppycrawl.tools.checkstyle.checks.imports.ImportOrderCheck)
import java.util.Collections;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
* Tracks which players are in which worlds, using a thread-safe map.
* This allows async access to online players list and the world they are in.
*
* @since 5.4
*/
@ApiStatus.AvailableSince("5.4")
@Service
public final class ConcurrentPlayerWorldTracker implements Listener {

private final Map<String, String> playerWorldMap;

@Inject
ConcurrentPlayerWorldTracker(@NotNull MultiverseCore plugin) {
this.playerWorldMap = new ConcurrentHashMap<>();
plugin.getServer().getPluginManager().registerEvents(this, plugin);
}

/**
* Get an unmodifiable collection of all online player names on the server.
*
* @return Unmodifiable collection of online player names.
*
* @since 5.4
*/
@ApiStatus.AvailableSince("5.4")
@NotNull
@UnmodifiableView
public Collection<String> getOnlinePlayers() {
return Collections.unmodifiableCollection(playerWorldMap.keySet());
}

/**
* Get the world name a player is currently in.
*
* @param playerName Name of the player.
* @return World name the player is in, or null if the player is not online.
*
* @since 5.4
*/
@ApiStatus.AvailableSince("5.4")
@NotNull
public Option<String> getPlayerWorld(String playerName) {
return Option.of(playerWorldMap.get(playerName));
}

@EventHandler(priority = EventPriority.LOWEST)
private void onPlayerJoin(PlayerJoinEvent event) {
setPlayerWorld(event.getPlayer());
}

@EventHandler(priority = EventPriority.LOWEST)
private void onPlayerChangedWorld(@NotNull PlayerChangedWorldEvent event) {
setPlayerWorld(event.getPlayer());
}

private void setPlayerWorld(Player player) {
String playerName = player.getName();
String worldName = player.getWorld().getName();
playerWorldMap.put(playerName, worldName);
}

@EventHandler
private void onPlayerQuit(@NotNull PlayerQuitEvent event) {
String playerName = event.getPlayer().getName();
playerWorldMap.remove(playerName);
}
}