Implement JoinDestination and EnableJoinDestination config options

This commit is contained in:
zax71 2023-09-04 12:30:50 +01:00
parent 046840f0d9
commit 3b7a801a0c
5 changed files with 123 additions and 9 deletions

View File

@ -125,6 +125,30 @@ public interface MVConfig {
*/ */
String getFirstSpawnLocation(); String getFirstSpawnLocation();
/**
* Sets alwaysSpawnDestination
* @param alwaysSpawnWorld The new value
*/
void setJoinDestination(String alwaysSpawnWorld);
/**
* Gets alwaysSpawnDestination
* @return alwaysSpawnLocation
*/
String getJoinDestination();
/**
* Sets alwaysSpawnDestination
* @param enableAlwaysSpawnDestination The new value
*/
void setEnableJoinDestination(boolean enableAlwaysSpawnDestination);
/**
* Gets enableAlwaysSpawnDestination
* @return enableAlwaysSpawnDestination
*/
boolean getEnableJoinDestination();
/** /**
* Sets whether or not to let Bukkit determine portal search radius on its own or if Multiverse should give input. * Sets whether or not to let Bukkit determine portal search radius on its own or if Multiverse should give input.
* *

View File

@ -3,6 +3,7 @@ package com.onarandombox.MultiverseCore.config;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.Objects;
import com.dumptruckman.minecraft.util.Logging; import com.dumptruckman.minecraft.util.Logging;
import com.onarandombox.MultiverseCore.MultiverseCore; import com.onarandombox.MultiverseCore.MultiverseCore;
@ -19,6 +20,7 @@ import io.vavr.control.Try;
import jakarta.inject.Inject; import jakarta.inject.Inject;
import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.PluginManager;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jvnet.hk2.annotations.Service; import org.jvnet.hk2.annotations.Service;
@Service @Service
@ -180,6 +182,30 @@ public class MVCoreConfig implements MVConfig {
return configHandle.get(configNodes.FIRST_SPAWN_LOCATION); return configHandle.get(configNodes.FIRST_SPAWN_LOCATION);
} }
@Override
public void setJoinDestination(String alwaysSpawnWorld) {
configHandle.set(configNodes.JOIN_DESTINATION, alwaysSpawnWorld);
}
@Override
@Nullable
public String getJoinDestination() {
if (Objects.equals(configHandle.get(configNodes.JOIN_DESTINATION), "")) {
return null;
}
return configHandle.get(configNodes.JOIN_DESTINATION);
}
@Override
public void setEnableJoinDestination(boolean enableJoinDestination) {
configHandle.set(configNodes.ENABLE_JOIN_DESTINATION, enableJoinDestination);
}
@Override
public boolean getEnableJoinDestination() {
return configHandle.get(configNodes.ENABLE_JOIN_DESTINATION);
}
@Override @Override
public void setUseCustomPortalSearch(boolean useDefaultPortalSearch) { public void setUseCustomPortalSearch(boolean useDefaultPortalSearch) {
configHandle.set(configNodes.USE_CUSTOM_PORTAL_SEARCH, useDefaultPortalSearch); configHandle.set(configNodes.USE_CUSTOM_PORTAL_SEARCH, useDefaultPortalSearch);

View File

@ -7,7 +7,6 @@ import com.onarandombox.MultiverseCore.configuration.node.Node;
import com.onarandombox.MultiverseCore.configuration.node.NodeGroup; import com.onarandombox.MultiverseCore.configuration.node.NodeGroup;
import com.onarandombox.MultiverseCore.event.MVDebugModeEvent; import com.onarandombox.MultiverseCore.event.MVDebugModeEvent;
import com.onarandombox.MultiverseCore.exceptions.MultiverseException; import com.onarandombox.MultiverseCore.exceptions.MultiverseException;
import io.github.townyadvanced.commentedconfiguration.setting.CommentedNode;
import io.vavr.control.Try; import io.vavr.control.Try;
import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.PluginManager;
@ -113,6 +112,21 @@ class MVCoreConfigNodes {
.name("first-spawn-location") .name("first-spawn-location")
.build()); .build());
public final ConfigNode<String> JOIN_DESTINATION = node(ConfigNode.builder("spawn.always-spawn-destination", String.class)
.comment("")
.comment("Sets the destination that Multiverse will use to spawn players on every login")
.comment("Set blank to disable")
.defaultValue("")
.name("always-spawn-destination")
.build());
public final ConfigNode<Boolean> ENABLE_JOIN_DESTINATION = node(ConfigNode.builder("spawn.enable-always-spawn-destination", Boolean.class)
.comment("")
.comment("Enables always-spawn-destination")
.defaultValue(false)
.name("enable-always-spawn-destination")
.build());
private final ConfigHeaderNode PORTAL_HEADER = node(ConfigHeaderNode.builder("portal") private final ConfigHeaderNode PORTAL_HEADER = node(ConfigHeaderNode.builder("portal")
.comment("") .comment("")
.comment("") .comment("")

View File

@ -85,7 +85,8 @@ public class DestinationsProvider {
* @param destinationString The destination string. * @param destinationString The destination string.
* @return The destination object, or null if invalid format. * @return The destination object, or null if invalid format.
*/ */
public ParsedDestination<?> parseDestination(String destinationString) { @Nullable
public ParsedDestination<?> parseDestination(@NotNull String destinationString) {
String[] items = destinationString.split(SEPARATOR, 2); String[] items = destinationString.split(SEPARATOR, 2);
String idString = items[0]; String idString = items[0];

View File

@ -18,6 +18,8 @@ import com.onarandombox.MultiverseCore.api.MVWorldManager;
import com.onarandombox.MultiverseCore.api.SafeTTeleporter; import com.onarandombox.MultiverseCore.api.SafeTTeleporter;
import com.onarandombox.MultiverseCore.commandtools.MVCommandManager; import com.onarandombox.MultiverseCore.commandtools.MVCommandManager;
import com.onarandombox.MultiverseCore.config.MVCoreConfig; import com.onarandombox.MultiverseCore.config.MVCoreConfig;
import com.onarandombox.MultiverseCore.destination.DestinationsProvider;
import com.onarandombox.MultiverseCore.destination.ParsedDestination;
import com.onarandombox.MultiverseCore.economy.MVEconomist; import com.onarandombox.MultiverseCore.economy.MVEconomist;
import com.onarandombox.MultiverseCore.event.MVRespawnEvent; import com.onarandombox.MultiverseCore.event.MVRespawnEvent;
import com.onarandombox.MultiverseCore.inject.InjectableListener; import com.onarandombox.MultiverseCore.inject.InjectableListener;
@ -43,6 +45,7 @@ import org.bukkit.event.player.PlayerPortalEvent;
import org.bukkit.event.player.PlayerRespawnEvent; import org.bukkit.event.player.PlayerRespawnEvent;
import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.event.player.PlayerTeleportEvent;
import org.bukkit.plugin.Plugin; import org.bukkit.plugin.Plugin;
import org.jetbrains.annotations.NotNull;
import org.jvnet.hk2.annotations.Service; import org.jvnet.hk2.annotations.Service;
/** /**
@ -53,6 +56,7 @@ public class MVPlayerListener implements InjectableListener {
private final Plugin plugin; private final Plugin plugin;
private final MVCoreConfig config; private final MVCoreConfig config;
private final Provider<MVWorldManager> worldManagerProvider; private final Provider<MVWorldManager> worldManagerProvider;
private final DestinationsProvider destinationsProvider;
private final SafeTTeleporter safeTTeleporter; private final SafeTTeleporter safeTTeleporter;
private final Server server; private final Server server;
private final TeleportQueue teleportQueue; private final TeleportQueue teleportQueue;
@ -68,6 +72,7 @@ public class MVPlayerListener implements InjectableListener {
MultiverseCore plugin, MultiverseCore plugin,
MVCoreConfig config, MVCoreConfig config,
Provider<MVWorldManager> worldManagerProvider, Provider<MVWorldManager> worldManagerProvider,
DestinationsProvider destinationsProvider,
SafeTTeleporter safeTTeleporter, SafeTTeleporter safeTTeleporter,
Server server, Server server,
TeleportQueue teleportQueue, TeleportQueue teleportQueue,
@ -79,6 +84,7 @@ public class MVPlayerListener implements InjectableListener {
this.plugin = plugin; this.plugin = plugin;
this.config = config; this.config = config;
this.worldManagerProvider = worldManagerProvider; this.worldManagerProvider = worldManagerProvider;
this.destinationsProvider = destinationsProvider;
this.safeTTeleporter = safeTTeleporter; this.safeTTeleporter = safeTTeleporter;
this.server = server; this.server = server;
this.teleportQueue = teleportQueue; this.teleportQueue = teleportQueue;
@ -154,26 +160,69 @@ public class MVPlayerListener implements InjectableListener {
*/ */
@EventHandler @EventHandler
public void playerJoin(PlayerJoinEvent event) { public void playerJoin(PlayerJoinEvent event) {
Player p = event.getPlayer(); Player player = event.getPlayer();
if (!p.hasPlayedBefore()) { if (!player.hasPlayedBefore()) {
Logging.finer("Player joined for the FIRST time!"); Logging.finer("Player joined for the FIRST time!");
if (config.getFirstSpawnOverride()) { if (config.getFirstSpawnOverride()) {
Logging.fine("Moving NEW player to(firstspawnoverride): " Logging.fine("Moving NEW player to(firstspawnoverride): "
+ getWorldManager().getFirstSpawnWorld().getSpawnLocation()); + getWorldManager().getFirstSpawnWorld().getSpawnLocation());
this.sendPlayerToDefaultWorld(p); this.sendPlayerToDefaultWorld(player);
} }
return; return;
} else { } else {
Logging.finer("Player joined AGAIN!"); Logging.finer("Player joined AGAIN!");
// Ensure the player still has permission to access the world they were in
if (config.getEnforceAccess() // check this only if we're enforcing access! if (config.getEnforceAccess() // check this only if we're enforcing access!
&& !permissionsChecker.hasWorldAccessPermission(p, getWorldManager().getFirstSpawnWorld())) { && !permissionsChecker.hasWorldAccessPermission(player, getWorldManager().getFirstSpawnWorld())) {
p.sendMessage("[MV] - Sorry you can't be in this world anymore!"); player.sendMessage("[MV] - Sorry you can't be in this world anymore!");
this.sendPlayerToDefaultWorld(p); this.sendPlayerToDefaultWorld(player);
} }
handleJoinDestination(player);
} }
// Handle the Players GameMode setting for the new world. // Handle the Players GameMode setting for the new world.
this.handleGameModeAndFlight(event.getPlayer(), event.getPlayer().getWorld()); this.handleGameModeAndFlight(event.getPlayer(), event.getPlayer().getWorld());
playerWorld.put(p.getName(), p.getWorld().getName()); playerWorld.put(player.getName(), player.getWorld().getName());
}
/**
* Will teleport the player to the destination specified in config
* @param player The {@link Player} to teleport
*/
private void handleJoinDestination(@NotNull Player player) {
if (!config.getEnableJoinDestination()) {
Logging.finer("JoinDestination is disabled");
// User has disabled the feature in config
return;
}
if (config.getJoinDestination() == null) {
Logging.warning("Joindestination is enabled but no destination has been specified in config!");
return;
}
Logging.finer("JoinDestination is " + config.getJoinDestination());
ParsedDestination<?> joinDestination = destinationsProvider.parseDestination(config.getJoinDestination());
if (joinDestination == null) {
Logging.warning("The destination in JoinDestination in config is invalid");
return;
}
Location joinDestinationLocation = joinDestination.getLocation(player);
if (joinDestinationLocation == null) {
Logging.finer("Not teleporting " + player.getName() + " because joinDestination is null");
return;
}
// Finally, teleport the player
player.teleport(joinDestinationLocation);
} }
/** /**