From 5ee5c8745e2d86c885e02ea213698a71dda0195a Mon Sep 17 00:00:00 2001 From: Wolf2323 Date: Wed, 11 Dec 2024 11:01:19 +0100 Subject: [PATCH 1/2] TASK-4957 reworked storage of last location game mode and visibility of the player to restore it after a camera and also to replay a camera after a logout --- pom.xml | 2 +- .../nl/svenar/powercamera/CameraHandler.java | 48 ++-- .../nl/svenar/powercamera/PowerCamera.java | 22 +- src/main/java/nl/svenar/powercamera/Util.java | 24 +- .../config/ActiveCameraStorage.java | 220 ++++++++++++++++++ .../powercamera/config/CameraStorage.java | 55 +---- .../powercamera/config/PluginConfig.java | 54 +++-- .../powercamera/events/PlayerJoinHandler.java | 42 ++-- .../tracker/PlayerCameraDataTracker.java | 8 +- 9 files changed, 325 insertions(+), 150 deletions(-) create mode 100644 src/main/java/nl/svenar/powercamera/config/ActiveCameraStorage.java diff --git a/pom.xml b/pom.xml index f18d097..33ca0e7 100644 --- a/pom.xml +++ b/pom.xml @@ -17,7 +17,7 @@ - 0.7.5 + 0.8.0 -SNAPSHOT diff --git a/src/main/java/nl/svenar/powercamera/CameraHandler.java b/src/main/java/nl/svenar/powercamera/CameraHandler.java index e9aeb9b..aa5500f 100644 --- a/src/main/java/nl/svenar/powercamera/CameraHandler.java +++ b/src/main/java/nl/svenar/powercamera/CameraHandler.java @@ -1,9 +1,5 @@ package nl.svenar.powercamera; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import nl.svenar.powercamera.data.CameraMode; import nl.svenar.powercamera.data.PlayerCameraData; @@ -16,14 +12,16 @@ import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.util.Vector; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + @SuppressFBWarnings("NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE") @SuppressWarnings({"PMD.AvoidCatchingGenericException", "PMD.AvoidDuplicateLiterals", "PMD.AvoidLiteralsInIfCondition", "PMD.AvoidReassigningParameters", "PMD.CallSuperInConstructor", "PMD.CognitiveComplexity", "PMD.CommentRequired", "PMD.CyclomaticComplexity", "PMD.GodClass", "PMD.LiteralsFirstInComparisons", "PMD.LocalVariableCouldBeFinal", "PMD.LooseCoupling", "PMD.MethodArgumentCouldBeFinal", "PMD.NPathComplexity", "PMD.RedundantFieldInitializer", "PMD.UnnecessaryCast", "PMD.UseDiamondOperator", "PMD.UselessParentheses"}) public class CameraHandler extends BukkitRunnable { private static final int SINGLE_FRAME_DURATION_MS = 50; - private int ticks = 0; - private final PowerCamera plugin; private final Player player; @@ -34,11 +32,7 @@ public class CameraHandler extends BukkitRunnable { private final HashMap> cameraPathCommands = new HashMap<>(); - private GameMode previousGamemode; - - private Location previousPlayerLocation; - - private boolean previousInvisible; + private int ticks = 0; public CameraHandler(PowerCamera plugin, Player player, String cameraName) { this.plugin = plugin; @@ -153,10 +147,7 @@ private double lerpYaw(double start, double end, float progress) { // Linear int } public CameraHandler start() { - this.previousGamemode = this.player.getGameMode(); - this.previousPlayerLocation = this.player.getLocation(); - this.previousInvisible = Util.isPlayerInvisible(this.player); - + plugin.getConfigActiveCameras().setCameraActive(cameraName, player); if (this.plugin.getConfigPlugin().getConfig().getBoolean("camera-effects.spectator-mode")) { player.setGameMode(GameMode.SPECTATOR); } @@ -173,6 +164,7 @@ public CameraHandler start() { if (!this.player.hasPermission("powercamera.hidestartmessages")) { this.player.sendMessage(this.plugin.getPluginChatPrefix() + ChatColor.GREEN + "Viewing the path of camera '" + this.cameraName + "'!"); } + return this; } @@ -184,13 +176,9 @@ public CameraHandler stop() { // ignored } - player.teleport(previousPlayerLocation); - if (this.plugin.getConfigPlugin().getConfig().getBoolean("camera-effects.spectator-mode")) { - player.setGameMode(previousGamemode); - } - if (this.plugin.getConfigPlugin().getConfig().getBoolean("camera-effects.invisible")) { - player.setInvisible(previousInvisible); - } + final boolean resetGameMode = this.plugin.getConfigPlugin().getConfig().getBoolean("camera-effects.spectator-mode"); + final boolean resetVisible = this.plugin.getConfigPlugin().getConfig().getBoolean("camera-effects.invisible"); + plugin.getConfigActiveCameras().setCameraInactive(player, true, resetGameMode, resetVisible); if (!this.player.hasPermission("powercamera.hidestartmessages")) { player.sendMessage(plugin.getPluginChatPrefix() + ChatColor.GREEN + "The path of camera '" + cameraName + "' has ended!"); @@ -230,13 +218,11 @@ public void run() { if (getCameraData().getCameraMode() == CameraMode.NONE) { return; } - player.teleport(previousPlayerLocation); - if (plugin.getConfigPlugin().getConfig().getBoolean("camera-effects.spectator-mode")) { - player.setGameMode(previousGamemode); - } - if (plugin.getConfigPlugin().getConfig().getBoolean("camera-effects.invisible")) { - player.setInvisible(previousInvisible); - } + + final boolean resetGameMode = this.plugin.getConfigPlugin().getConfig().getBoolean("camera-effects.spectator-mode"); + final boolean resetVisible = this.plugin.getConfigPlugin().getConfig().getBoolean("camera-effects.invisible"); + plugin.getConfigActiveCameras().setCameraInactive(player, true, resetGameMode, resetVisible); + getCameraData().setCameraMode(CameraMode.NONE); player.sendMessage(plugin.getPluginChatPrefix() + ChatColor.GREEN + "Preview ended!"); @@ -264,10 +250,8 @@ public CameraHandler preview(Player player, int num, int previewTime) { player.sendMessage(plugin.getPluginChatPrefix() + ChatColor.GREEN + "Preview started of point " + (num + 1) + "!"); player.sendMessage(plugin.getPluginChatPrefix() + ChatColor.GREEN + "Ending in " + previewTime + " seconds."); - previousGamemode = player.getGameMode(); - previousPlayerLocation = player.getLocation(); + plugin.getConfigActiveCameras().setCameraActive(cameraName, player); Location point = Util.deserializeLocation(cameraPoints.get(num).split(":", 3)[2]); - previousInvisible = player.isInvisible(); getCameraData().setCameraMode(CameraMode.PREVIEW); if (this.plugin.getConfigPlugin().getConfig().getBoolean("camera-effects.spectator-mode")) { diff --git a/src/main/java/nl/svenar/powercamera/PowerCamera.java b/src/main/java/nl/svenar/powercamera/PowerCamera.java index 2af9642..7f4be91 100644 --- a/src/main/java/nl/svenar/powercamera/PowerCamera.java +++ b/src/main/java/nl/svenar/powercamera/PowerCamera.java @@ -1,12 +1,8 @@ package nl.svenar.powercamera; -import java.time.Instant; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import nl.svenar.powercamera.commands.MainCommand; +import nl.svenar.powercamera.config.ActiveCameraStorage; import nl.svenar.powercamera.config.CameraStorage; import nl.svenar.powercamera.config.PluginConfig; import nl.svenar.powercamera.events.ChatTabExecutor; @@ -19,6 +15,11 @@ import org.bukkit.plugin.PluginDescriptionFile; import org.bukkit.plugin.java.JavaPlugin; +import java.time.Instant; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + @SuppressFBWarnings({"DLS_DEAD_LOCAL_STORE", "MS_MUTABLE_COLLECTION_PKGPROTECT", "NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE"}) @SuppressWarnings({"PMD.AtLeastOneConstructor", "PMD.AvoidDuplicateLiterals", "PMD.AvoidReassigningLoopVariables", "PMD.CognitiveComplexity", "PMD.CommentRequired", "PMD.CyclomaticComplexity", "PMD.LocalVariableCouldBeFinal", "PMD.LooseCoupling", "PMD.UnnecessaryImport", "PMD.UseDiamondOperator"}) public class PowerCamera extends JavaPlugin { @@ -27,13 +28,13 @@ public class PowerCamera extends JavaPlugin { public static final List DONATION_URLS = Arrays.asList("https://ko-fi.com/svenar", "https://patreon.com/svenar"); - private PlayerCameraDataTracker playerCameraDataTracker; - // public Map playerSelectedCamera = new HashMap<>(); // Selected camera name // public Map playerCameraMode = new HashMap<>(); // When the player is viewing the camera (/pc start & /pc preview) // public Map playerCameraHandler = new HashMap<>(); // When the player is viewing the camera (/pc start & /pc preview) public Instant powercameraStartTime = Instant.now(); + private PlayerCameraDataTracker playerCameraDataTracker; + private PluginDescriptionFile pdf; private String pluginChatPrefix = ChatColor.BLACK + "[" + ChatColor.AQUA + "%pluginName%" + ChatColor.BLACK + "] "; @@ -42,6 +43,8 @@ public class PowerCamera extends JavaPlugin { private CameraStorage configCameras; + private ActiveCameraStorage configActiveCameras; + private MainCommand mainCommand; @Override @@ -93,6 +96,7 @@ public String getPluginChatPrefix() { private void setupConfig() { configPlugin = new PluginConfig(this, "config.yml"); configCameras = new CameraStorage(this); + configActiveCameras = new ActiveCameraStorage(this); configPlugin.getConfig().set("version", null); configCameras.getConfig().set("version", null); @@ -150,6 +154,10 @@ public CameraStorage getConfigCameras() { return configCameras; } + public ActiveCameraStorage getConfigActiveCameras() { + return configActiveCameras; + } + public MainCommand getMainCommand() { return mainCommand; } diff --git a/src/main/java/nl/svenar/powercamera/Util.java b/src/main/java/nl/svenar/powercamera/Util.java index cbcb69b..5c2e3e1 100644 --- a/src/main/java/nl/svenar/powercamera/Util.java +++ b/src/main/java/nl/svenar/powercamera/Util.java @@ -1,23 +1,18 @@ package nl.svenar.powercamera; -import java.util.UUID; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.World; -import org.bukkit.entity.Player; -import org.bukkit.potion.PotionEffectType; + +import java.util.UUID; +import java.util.regex.Matcher; +import java.util.regex.Pattern; @SuppressFBWarnings("NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE") @SuppressWarnings({"PMD.CommentRequired", "PMD.FieldDeclarationsShouldBeAtStartOfClass", "PMD.LocalVariableCouldBeFinal", "PMD.MethodArgumentCouldBeFinal", "PMD.ShortClassName", "PMD.ShortVariable"}) public final class Util { - private Util() { - } - private static final Pattern REGEX_INT = Pattern.compile("^\\d+[^a-zA-Z]?$"); private static final Pattern REGEX_SECONDS = Pattern.compile("\\d+[sS]"); @@ -26,6 +21,9 @@ private Util() { private static final Pattern REGEX_HOURS = Pattern.compile("\\d+[hH]"); + private Util() { + } + public static String serializeLocation(Location loc) { return loc.getWorld().getUID() + ";" + loc.getX() + ";" + loc.getY() + ";" + loc.getZ() + ";" + loc.getYaw() + ";" + loc.getPitch(); } @@ -77,12 +75,4 @@ public static int timeStringToSecondsConverter(String timeInput) { return seconds; } - - public static boolean isPlayerInvisible(Player player) { - try { - return player.isInvisible(); - } catch (NoSuchMethodError e) { - return player.hasPotionEffect(PotionEffectType.INVISIBILITY); - } - } } diff --git a/src/main/java/nl/svenar/powercamera/config/ActiveCameraStorage.java b/src/main/java/nl/svenar/powercamera/config/ActiveCameraStorage.java new file mode 100644 index 0000000..e4518dc --- /dev/null +++ b/src/main/java/nl/svenar/powercamera/config/ActiveCameraStorage.java @@ -0,0 +1,220 @@ +package nl.svenar.powercamera.config; + +import nl.svenar.powercamera.PowerCamera; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.NamespacedKey; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.bukkit.persistence.PersistentDataAdapterContext; +import org.bukkit.persistence.PersistentDataContainer; +import org.bukkit.persistence.PersistentDataType; +import org.bukkit.util.NumberConversions; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * Storage for active cameras. + */ +public class ActiveCameraStorage { + /** + * The persistent data location type. + */ + private static final PersistentDataLocation PERSISTENT_DATA_LOCATION = new PersistentDataLocation(); + + /** + * The persistent data game mode type. + */ + private static final PersistentDataGameMode PERSISTENT_DATA_GAME_MODE = new PersistentDataGameMode(); + + /** + * The persistent data boolean type. + */ + private static final PersistentDataBoolean PERSISTENT_DATA_BOOLEAN = new PersistentDataBoolean(); + + /** + * The active camera key. + */ + private final NamespacedKey activeCamera; + + /** + * The last location key. + */ + private final NamespacedKey lastLocation; + + /** + * The last game mode key. + */ + private final NamespacedKey lastGameMode; + + /** + * The last visibility key. + */ + private final NamespacedKey lastVisibility; + + /** + * Instantiates a new Active camera storage. + * + * @param plugin The plugin. + */ + public ActiveCameraStorage(final PowerCamera plugin) { + activeCamera = new NamespacedKey(plugin, "activeCamera"); + lastLocation = new NamespacedKey(plugin, "lastLocation"); + lastGameMode = new NamespacedKey(plugin, "lastGameMode"); + lastVisibility = new NamespacedKey(plugin, "lastVisibility"); + } + + /** + * Set the camera for a player as active. + * + * @param cameraName The camera name. + * @param player The player. + */ + public void setCameraActive(final String cameraName, final Player player) { + final PersistentDataContainer persistentDataContainer = player.getPersistentDataContainer(); + persistentDataContainer.set(activeCamera, PersistentDataType.STRING, cameraName); + if (!persistentDataContainer.has(lastLocation, PERSISTENT_DATA_LOCATION)) { + persistentDataContainer.set(lastLocation, PERSISTENT_DATA_LOCATION, player.getLocation()); + } + if (!persistentDataContainer.has(lastGameMode, PERSISTENT_DATA_GAME_MODE)) { + persistentDataContainer.set(lastGameMode, PERSISTENT_DATA_GAME_MODE, player.getGameMode()); + } + if (!persistentDataContainer.has(lastVisibility, PERSISTENT_DATA_BOOLEAN)) { + persistentDataContainer.set(lastVisibility, PERSISTENT_DATA_BOOLEAN, player.isInvisible()); + } + } + + /** + * Set the camera for a player as inactive. + * + * @param player The player. + */ + public void setCameraInactive(final Player player, final boolean location, final boolean gameMode, final boolean visibility) { + final PersistentDataContainer persistentDataContainer = player.getPersistentDataContainer(); + persistentDataContainer.remove(activeCamera); + if (location) { + final Location locationValue = persistentDataContainer.get(lastLocation, PERSISTENT_DATA_LOCATION); + if (locationValue != null) { + player.teleport(locationValue); + } + } + persistentDataContainer.remove(lastLocation); + if (gameMode) { + final GameMode gameModeValue = persistentDataContainer.get(lastGameMode, PERSISTENT_DATA_GAME_MODE); + if (gameModeValue != null) { + player.setGameMode(gameModeValue); + } + } + persistentDataContainer.remove(lastGameMode); + if (visibility) { + final Boolean visibilityValue = persistentDataContainer.get(lastVisibility, PERSISTENT_DATA_BOOLEAN); + if (visibilityValue != null) { + player.setInvisible(visibilityValue); + } + } + persistentDataContainer.remove(lastVisibility); + } + + /** + * Get the active camera for a player. + * + * @param player The player. + * @return The active camera or null if no camera is active. + */ + @Nullable + public String getActiveCamera(final Player player) { + return player.getPersistentDataContainer().get(activeCamera, PersistentDataType.STRING); + } + + /** + * {@link PersistentDataType} for {@link Location}. + */ + private static final class PersistentDataLocation implements PersistentDataType { + + @Override + public @NotNull Class getPrimitiveType() { + return String.class; + } + + @Override + public @NotNull Class getComplexType() { + return Location.class; + } + + @Override + public @NotNull String toPrimitive(@NotNull final Location complex, @NotNull final PersistentDataAdapterContext context) { + final World world = complex.getWorld(); + final String worldName = world == null ? "" : world.getName(); + return String.format("%s;%s;%s;%s;%s;%s", worldName, complex.getX(), complex.getY(), complex.getZ(), complex.getYaw(), complex.getPitch()); + } + + @Override + public @NotNull Location fromPrimitive(@NotNull final String primitive, @NotNull final PersistentDataAdapterContext context) { + final String[] parts = primitive.split(";"); + + World world = null; + final String worldName = parts[0]; + if (worldName != null && !worldName.isEmpty()) { + world = Bukkit.getWorld(worldName); + if (world == null) { + throw new IllegalArgumentException("unknown world"); + } + } + return new Location(world, NumberConversions.toDouble(parts[1]), NumberConversions.toDouble(parts[2]), + NumberConversions.toDouble(parts[3]), NumberConversions.toFloat(parts[4]), NumberConversions.toFloat(parts[5])); + } + } + + /** + * {@link PersistentDataType} for {@link GameMode}. + */ + private static final class PersistentDataGameMode implements PersistentDataType { + + @Override + public @NotNull Class getPrimitiveType() { + return String.class; + } + + @Override + public @NotNull Class getComplexType() { + return GameMode.class; + } + + @Override + public @NotNull String toPrimitive(@NotNull final GameMode complex, @NotNull final PersistentDataAdapterContext context) { + return complex.name(); + } + + @Override + public @NotNull GameMode fromPrimitive(@NotNull final String primitive, @NotNull final PersistentDataAdapterContext context) { + return GameMode.valueOf(primitive); + } + } + + /** + * {@link PersistentDataType} for {@link Boolean}. + */ + private static final class PersistentDataBoolean implements PersistentDataType { + + @Override + public @NotNull Class getPrimitiveType() { + return Byte.class; + } + + @Override + public @NotNull Class getComplexType() { + return Boolean.class; + } + + @Override + public @NotNull Byte toPrimitive(@NotNull final Boolean complex, @NotNull final PersistentDataAdapterContext context) { + return complex ? (byte) 1 : 0; + } + + @Override + public @NotNull Boolean fromPrimitive(@NotNull final Byte primitive, @NotNull final PersistentDataAdapterContext context) { + return primitive == 1; + } + } +} diff --git a/src/main/java/nl/svenar/powercamera/config/CameraStorage.java b/src/main/java/nl/svenar/powercamera/config/CameraStorage.java index a5d5420..736d34b 100644 --- a/src/main/java/nl/svenar/powercamera/config/CameraStorage.java +++ b/src/main/java/nl/svenar/powercamera/config/CameraStorage.java @@ -1,6 +1,11 @@ package nl.svenar.powercamera.config; -import java.io.File; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; +import nl.svenar.powercamera.PowerCamera; +import nl.svenar.powercamera.Util; +import org.bukkit.Location; +import org.bukkit.configuration.InvalidConfigurationException; + import java.io.IOException; import java.util.ArrayList; import java.util.Collections; @@ -8,55 +13,11 @@ import java.util.Set; import java.util.UUID; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; -import nl.svenar.powercamera.PowerCamera; -import nl.svenar.powercamera.Util; -import org.bukkit.Location; -import org.bukkit.configuration.InvalidConfigurationException; -import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.configuration.file.YamlConfiguration; - @SuppressFBWarnings({"CT_CONSTRUCTOR_THROW", "NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE", "RV_RETURN_VALUE_IGNORED_BAD_PRACTICE"}) @SuppressWarnings({"PMD.AvoidDuplicateLiterals", "PMD.AvoidPrintStackTrace", "PMD.AvoidReassigningParameters", "PMD.CommentRequired", "PMD.LinguisticNaming", "PMD.LocalVariableCouldBeFinal", "PMD.MethodArgumentCouldBeFinal", "PMD.TooManyMethods", "PMD.UseCollectionIsEmpty", "PMD.UseDiamondOperator"}) -public class CameraStorage { - - private File configFile; - - private FileConfiguration config; - - private final PowerCamera plugin; - +public class CameraStorage extends PluginConfig { public CameraStorage(PowerCamera plugin) { - this.plugin = plugin; - - createConfigFile(); - } - - private void createConfigFile() { - configFile = new File(plugin.getDataFolder(), "camera.yml"); - if (!configFile.exists()) { - configFile.getParentFile().mkdirs(); - plugin.saveResource("camera.yml", false); - } - - config = new YamlConfiguration(); - try { - config.load(configFile); - } catch (IOException | InvalidConfigurationException e) { - e.printStackTrace(); - } - } - - public FileConfiguration getConfig() { - return this.config; - } - - public void saveConfig() { - try { - this.config.save(this.configFile); - } catch (IOException e) { - plugin.getLogger().severe("Error saving " + configFile.getName()); - } + super(plugin, "camera.yml"); } public void reloadConfig() { diff --git a/src/main/java/nl/svenar/powercamera/config/PluginConfig.java b/src/main/java/nl/svenar/powercamera/config/PluginConfig.java index 77a93f8..58d866e 100644 --- a/src/main/java/nl/svenar/powercamera/config/PluginConfig.java +++ b/src/main/java/nl/svenar/powercamera/config/PluginConfig.java @@ -1,54 +1,68 @@ package nl.svenar.powercamera.config; -import java.io.File; -import java.io.IOException; - import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import nl.svenar.powercamera.PowerCamera; import org.bukkit.configuration.InvalidConfigurationException; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; +import java.io.File; +import java.io.IOException; +import java.util.logging.Level; + @SuppressFBWarnings({"CT_CONSTRUCTOR_THROW", "RV_RETURN_VALUE_IGNORED_BAD_PRACTICE"}) @SuppressWarnings({"PMD.AvoidPrintStackTrace", "PMD.CommentRequired", "PMD.MethodArgumentCouldBeFinal"}) public class PluginConfig { - private File configFile; + protected final PowerCamera plugin; - private FileConfiguration config; + protected final File configFile; - private final PowerCamera plugin; + protected final FileConfiguration config; public PluginConfig(PowerCamera plugin, String fileName) { this.plugin = plugin; - createConfigFile(fileName); + configFile = createConfigFile(fileName); + config = createConfig(configFile); } - private void createConfigFile(String fileName) { - configFile = new File(plugin.getDataFolder(), fileName); - if (!configFile.exists()) { - configFile.getParentFile().mkdirs(); - plugin.saveResource(fileName, false); + private File createConfigFile(final String fileName) { + final File file = new File(plugin.getDataFolder(), fileName); + if (!file.exists()) { + file.getParentFile().mkdirs(); + if (plugin.getResource(fileName) == null) { + try { + file.createNewFile(); + } catch (IOException e) { + plugin.getLogger().log(Level.SEVERE, "Error creating " + file.getName(), e); + } + } else { + plugin.saveResource(fileName, false); + } } + return file; + } - config = new YamlConfiguration(); + private FileConfiguration createConfig(File file) { + final FileConfiguration config = new YamlConfiguration(); try { - config.load(configFile); + config.load(file); } catch (IOException | InvalidConfigurationException e) { - e.printStackTrace(); + plugin.getLogger().log(Level.SEVERE, "Error loading " + file.getName(), e); } - } - - public FileConfiguration getConfig() { - return this.config; + return config; } public void saveConfig() { try { this.config.save(this.configFile); } catch (IOException e) { - plugin.getLogger().severe("Error saving " + configFile.getName()); + plugin.getLogger().log(Level.SEVERE, "Error saving " + configFile.getName(), e); } } + + public FileConfiguration getConfig() { + return this.config; + } } diff --git a/src/main/java/nl/svenar/powercamera/events/PlayerJoinHandler.java b/src/main/java/nl/svenar/powercamera/events/PlayerJoinHandler.java index 6d1e498..f071a60 100644 --- a/src/main/java/nl/svenar/powercamera/events/PlayerJoinHandler.java +++ b/src/main/java/nl/svenar/powercamera/events/PlayerJoinHandler.java @@ -1,8 +1,5 @@ package nl.svenar.powercamera.events; -import java.util.List; -import java.util.Random; -import java.util.concurrent.ThreadLocalRandom; import nl.svenar.powercamera.CameraHandler; import nl.svenar.powercamera.PowerCamera; import org.bukkit.entity.Player; @@ -11,6 +8,10 @@ import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; @SuppressWarnings({"PMD.AvoidCatchingGenericException", "PMD.CommentRequired", "PMD.EmptyCatchBlock", "PMD.LocalVariableCouldBeFinal", "PMD.MethodArgumentCouldBeFinal", "PMD.UnusedPrivateMethod", "PMD.UselessParentheses"}) public class PlayerJoinHandler implements Listener { @@ -28,36 +29,33 @@ public void onPlayerJoin(PlayerJoinEvent event) { plugin.getPlayerData().handlePlayerJoin(player); try { - if (player.hasPermission("powercamera.bypass.joincamera")) { - return; - } - - if (!(this.plugin.getConfigCameras().addPlayer(player.getUniqueId()) || !this.plugin.getConfigPlugin().getConfig() - .getBoolean("on-join.show-once"))) { - return; + String cameraName = getActiveCamera(player); + if (cameraName == null) { + cameraName = getJoinCamera(player); } - List joinCameras = this.plugin.getConfigPlugin().getConfig().getStringList("on-join.random-player-camera-path"); - Random rand = ThreadLocalRandom.current(); - String cameraName = joinCameras.get(rand.nextInt(joinCameras.size())); - - if (!cameraName.isEmpty() && (this.plugin.getConfigCameras().cameraExists(cameraName))) { + if (cameraName != null && !cameraName.isEmpty() && (this.plugin.getConfigCameras().cameraExists(cameraName))) { CameraHandler cameraHandler = new CameraHandler(plugin, player, cameraName).generatePath().start(); plugin.getPlayerData().get(player).setCameraHandler(cameraHandler); } } catch (Exception ex) { // Ignore } + } - try { - if (player.isInvisible()) { - player.setInvisible(false); - } - } catch (Exception ex) { - // Ignore - // This will be triggered on older versions + private @Nullable String getActiveCamera(final Player player) { + return this.plugin.getConfigActiveCameras().getActiveCamera(player); + } + + private @Nullable String getJoinCamera(final Player player) { + if (player.hasPermission("powercamera.bypass.joincamera") + || !(this.plugin.getConfigCameras().addPlayer(player.getUniqueId()) + || !this.plugin.getConfigPlugin().getConfig().getBoolean("on-join.show-once"))) { + return null; } + List joinCameras = this.plugin.getConfigPlugin().getConfig().getStringList("on-join.random-player-camera-path"); + return joinCameras.get(ThreadLocalRandom.current().nextInt(joinCameras.size())); } @EventHandler diff --git a/src/main/java/nl/svenar/powercamera/tracker/PlayerCameraDataTracker.java b/src/main/java/nl/svenar/powercamera/tracker/PlayerCameraDataTracker.java index c87d26c..61ebe27 100644 --- a/src/main/java/nl/svenar/powercamera/tracker/PlayerCameraDataTracker.java +++ b/src/main/java/nl/svenar/powercamera/tracker/PlayerCameraDataTracker.java @@ -1,10 +1,11 @@ package nl.svenar.powercamera.tracker; +import nl.svenar.powercamera.data.PlayerCameraData; +import org.bukkit.entity.Player; + import java.util.Map; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; -import nl.svenar.powercamera.data.PlayerCameraData; -import org.bukkit.entity.Player; @SuppressWarnings({"PMD.AtLeastOneConstructor", "PMD.CommentRequired", "PMD.MethodArgumentCouldBeFinal"}) public class PlayerCameraDataTracker { @@ -24,7 +25,6 @@ public void handlePlayerJoin(Player player) { } public void handlePlayerQuit(Player player) { - cameraDataMap.remove(player.getUniqueId()); + cameraDataMap.remove(player.getUniqueId()).getCameraHandler().cancel(); } - } From 0f2039ef7120f2743a8e261cdd45c6874c0c1d93 Mon Sep 17 00:00:00 2001 From: Wolf2323 Date: Wed, 11 Dec 2024 15:27:43 +0100 Subject: [PATCH 2/2] TASK-4957 updated api version to 1.20.4 to use PersistentDataType.BOOLEAN instead of self implementing it --- pom.xml | 11 +-- .../config/ActiveCameraStorage.java | 37 +--------- src/main/resources/plugin.yml | 74 +++++++++---------- 3 files changed, 46 insertions(+), 76 deletions(-) diff --git a/pom.xml b/pom.xml index 33ca0e7..37dbe41 100644 --- a/pom.xml +++ b/pom.xml @@ -1,6 +1,6 @@ - + 4.0.0 @@ -35,7 +35,8 @@ ${project.artifactId}-site - file:///tmp/dummy-site + file:///tmp/dummy-site + @@ -43,7 +44,7 @@ org.spigotmc spigot-api - 1.16.3-R0.1-20201025.071724-27 + 1.20.4-R0.1-20240423.152506-123 provided diff --git a/src/main/java/nl/svenar/powercamera/config/ActiveCameraStorage.java b/src/main/java/nl/svenar/powercamera/config/ActiveCameraStorage.java index e4518dc..84b4fef 100644 --- a/src/main/java/nl/svenar/powercamera/config/ActiveCameraStorage.java +++ b/src/main/java/nl/svenar/powercamera/config/ActiveCameraStorage.java @@ -28,11 +28,6 @@ public class ActiveCameraStorage { */ private static final PersistentDataGameMode PERSISTENT_DATA_GAME_MODE = new PersistentDataGameMode(); - /** - * The persistent data boolean type. - */ - private static final PersistentDataBoolean PERSISTENT_DATA_BOOLEAN = new PersistentDataBoolean(); - /** * The active camera key. */ @@ -80,8 +75,8 @@ public void setCameraActive(final String cameraName, final Player player) { if (!persistentDataContainer.has(lastGameMode, PERSISTENT_DATA_GAME_MODE)) { persistentDataContainer.set(lastGameMode, PERSISTENT_DATA_GAME_MODE, player.getGameMode()); } - if (!persistentDataContainer.has(lastVisibility, PERSISTENT_DATA_BOOLEAN)) { - persistentDataContainer.set(lastVisibility, PERSISTENT_DATA_BOOLEAN, player.isInvisible()); + if (!persistentDataContainer.has(lastVisibility, PersistentDataType.BOOLEAN)) { + persistentDataContainer.set(lastVisibility, PersistentDataType.BOOLEAN, player.isInvisible()); } } @@ -108,7 +103,7 @@ public void setCameraInactive(final Player player, final boolean location, final } persistentDataContainer.remove(lastGameMode); if (visibility) { - final Boolean visibilityValue = persistentDataContainer.get(lastVisibility, PERSISTENT_DATA_BOOLEAN); + final Boolean visibilityValue = persistentDataContainer.get(lastVisibility, PersistentDataType.BOOLEAN); if (visibilityValue != null) { player.setInvisible(visibilityValue); } @@ -191,30 +186,4 @@ private static final class PersistentDataGameMode implements PersistentDataType< return GameMode.valueOf(primitive); } } - - /** - * {@link PersistentDataType} for {@link Boolean}. - */ - private static final class PersistentDataBoolean implements PersistentDataType { - - @Override - public @NotNull Class getPrimitiveType() { - return Byte.class; - } - - @Override - public @NotNull Class getComplexType() { - return Boolean.class; - } - - @Override - public @NotNull Byte toPrimitive(@NotNull final Boolean complex, @NotNull final PersistentDataAdapterContext context) { - return complex ? (byte) 1 : 0; - } - - @Override - public @NotNull Boolean fromPrimitive(@NotNull final Byte primitive, @NotNull final PersistentDataAdapterContext context) { - return primitive == 1; - } - } } diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index fa8ad0b..0a08931 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,44 +1,44 @@ name: '${project.name}' version: '${project.version}' main: nl.svenar.powercamera.PowerCamera -api-version: 1.13 +api-version: 1.20 description: "Power Camera: Create awesome cinematic videos" -authors: [svenar_nl] +authors: [ svenar_nl ] website: 'http://dev.bukkit.org/bukkit-plugins/powercamera/' commands: - powercamera: - description: Main command - aliases: [powercam, pcam, pc, cam] + powercamera: + description: Main command + aliases: [ powercam, pcam, pc, cam ] permissions: - powercamera.cmd.help: - default: op - powercamera.cmd.reload: - default: op - powercamera.cmd.create: - default: op - powercamera.cmd.remove: - default: op - powercamera.cmd.addpoint: - default: op - powercamera.cmd.delpoint: - default: op - powercamera.cmd.select: - default: op - powercamera.cmd.preview: - default: op - powercamera.cmd.info: - default: op - powercamera.cmd.setduration: - default: op - powercamera.cmd.start: - default: op - powercamera.cmd.startother: - default: op - powercamera.cmd.stop: - default: op - powercamera.cmd.stats: - default: op - powercamera.hidestartmessages: - default: not op - powercamera.bypass.joincamera: - default: false + powercamera.cmd.help: + default: op + powercamera.cmd.reload: + default: op + powercamera.cmd.create: + default: op + powercamera.cmd.remove: + default: op + powercamera.cmd.addpoint: + default: op + powercamera.cmd.delpoint: + default: op + powercamera.cmd.select: + default: op + powercamera.cmd.preview: + default: op + powercamera.cmd.info: + default: op + powercamera.cmd.setduration: + default: op + powercamera.cmd.start: + default: op + powercamera.cmd.startother: + default: op + powercamera.cmd.stop: + default: op + powercamera.cmd.stats: + default: op + powercamera.hidestartmessages: + default: not op + powercamera.bypass.joincamera: + default: false