Save player data on WorldSaveEvent, add config option, close #21

feat/data-edit-commands
William 3 years ago
parent 0f215c80ea
commit da7a85dde9

@ -33,7 +33,7 @@ public class HuskSyncAPI {
} }
/** /**
* (INTERNAL) Map of API requests that are processed by the bukkit plugin that implements the API. * <b>(Internal only)</b> Map of API requests that are processed by the bukkit plugin that implements the API.
*/ */
public static HashMap<UUID, CompletableFuture<PlayerData>> apiRequests = new HashMap<>(); public static HashMap<UUID, CompletableFuture<PlayerData>> apiRequests = new HashMap<>();

@ -144,7 +144,7 @@ public final class HuskSyncBukkit extends JavaPlugin {
if (HuskSyncBukkit.handshakeCompleted && !HuskSyncBukkit.isMySqlPlayerDataBridgeInstalled && Bukkit.getOnlinePlayers().size() > 0) { if (HuskSyncBukkit.handshakeCompleted && !HuskSyncBukkit.isMySqlPlayerDataBridgeInstalled && Bukkit.getOnlinePlayers().size() > 0) {
getLogger().info("Saving data for remaining online players..."); getLogger().info("Saving data for remaining online players...");
for (Player player : Bukkit.getOnlinePlayers()) { for (Player player : Bukkit.getOnlinePlayers()) {
PlayerSetter.updatePlayerData(player); PlayerSetter.updatePlayerData(player, false);
} }
getLogger().info("Data save complete!"); getLogger().info("Data save complete!");
} }

@ -27,6 +27,7 @@ public class ConfigLoader {
Settings.syncFlight = config.getBoolean("synchronisation_settings.flight", false); Settings.syncFlight = config.getBoolean("synchronisation_settings.flight", false);
Settings.useNativeImplementation = config.getBoolean("native_advancement_synchronization", false); Settings.useNativeImplementation = config.getBoolean("native_advancement_synchronization", false);
Settings.saveOnWorldSave = config.getBoolean("save_on_world_save", true);
Settings.synchronizationTimeoutRetryDelay = config.getLong("synchronization_timeout_retry_delay", 15L); Settings.synchronizationTimeoutRetryDelay = config.getLong("synchronization_timeout_retry_delay", 15L);
} }

@ -15,6 +15,7 @@ import org.bukkit.event.entity.EntityPickupItemEvent;
import org.bukkit.event.inventory.InventoryCloseEvent; import org.bukkit.event.inventory.InventoryCloseEvent;
import org.bukkit.event.inventory.InventoryOpenEvent; import org.bukkit.event.inventory.InventoryOpenEvent;
import org.bukkit.event.player.*; import org.bukkit.event.player.*;
import org.bukkit.event.world.WorldSaveEvent;
import java.io.IOException; import java.io.IOException;
import java.util.logging.Level; import java.util.logging.Level;
@ -38,7 +39,7 @@ public class BukkitEventListener implements Listener {
return; // If the plugin has not been initialized correctly return; // If the plugin has not been initialized correctly
// Update the player's data // Update the player's data
Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> PlayerSetter.updatePlayerData(player)); Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> PlayerSetter.updatePlayerData(player, true));
} }
@EventHandler(priority = EventPriority.LOWEST) @EventHandler(priority = EventPriority.LOWEST)
@ -145,4 +146,14 @@ public class BukkitEventListener implements Listener {
event.setCancelled(true); // If the plugin / player has not been set event.setCancelled(true); // If the plugin / player has not been set
} }
} }
@EventHandler(priority = EventPriority.NORMAL)
public void onWorldSave(WorldSaveEvent event) {
if (!plugin.isEnabled() || !HuskSyncBukkit.handshakeCompleted) {
return;
}
for (Player playerInWorld : event.getWorld().getPlayers()) {
PlayerSetter.updatePlayerData(playerInWorld, false);
}
}
} }

@ -96,14 +96,15 @@ public class PlayerSetter {
* Update a {@link Player}'s data, sending it to the proxy * Update a {@link Player}'s data, sending it to the proxy
* *
* @param player {@link Player} to send data to proxy * @param player {@link Player} to send data to proxy
* @param bounceBack whether the plugin should bounce-back the updated data to the player (used for server switching)
*/ */
public static void updatePlayerData(Player player) { public static void updatePlayerData(Player player, boolean bounceBack) {
// Send a redis message with the player's last updated PlayerData version UUID and their new PlayerData // Send a redis message with the player's last updated PlayerData version UUID and their new PlayerData
try { try {
final String serializedPlayerData = getNewSerializedPlayerData(player); final String serializedPlayerData = getNewSerializedPlayerData(player);
new RedisMessage(RedisMessage.MessageType.PLAYER_DATA_UPDATE, new RedisMessage(RedisMessage.MessageType.PLAYER_DATA_UPDATE,
new RedisMessage.MessageTarget(Settings.ServerType.PROXY, null, Settings.cluster), new RedisMessage.MessageTarget(Settings.ServerType.PROXY, null, Settings.cluster),
serializedPlayerData).send(); serializedPlayerData, Boolean.toString(bounceBack)).send();
} catch (IOException e) { } catch (IOException e) {
plugin.getLogger().log(Level.SEVERE, "Failed to send a PlayerData update to the proxy", e); plugin.getLogger().log(Level.SEVERE, "Failed to send a PlayerData update to the proxy", e);
} }

@ -18,4 +18,5 @@ synchronisation_settings:
cluster_id: 'main' cluster_id: 'main'
check_for_updates: true check_for_updates: true
synchronization_timeout_retry_delay: 15 synchronization_timeout_retry_delay: 15
save_on_world_save: true
native_advancement_synchronization: false native_advancement_synchronization: false

@ -92,7 +92,8 @@ public class BungeeRedisListener extends RedisListener {
case PLAYER_DATA_UPDATE -> ProxyServer.getInstance().getScheduler().runAsync(plugin, () -> { case PLAYER_DATA_UPDATE -> ProxyServer.getInstance().getScheduler().runAsync(plugin, () -> {
// Deserialize the PlayerData received // Deserialize the PlayerData received
PlayerData playerData; PlayerData playerData;
final String serializedPlayerData = message.getMessageData(); final String serializedPlayerData = message.getMessageDataElements()[0];
final boolean bounceBack = Boolean.parseBoolean(message.getMessageDataElements()[1]);
try { try {
playerData = (PlayerData) RedisMessage.deserialize(serializedPlayerData); playerData = (PlayerData) RedisMessage.deserialize(serializedPlayerData);
} catch (IOException | ClassNotFoundException e) { } catch (IOException | ClassNotFoundException e) {
@ -110,7 +111,7 @@ public class BungeeRedisListener extends RedisListener {
} }
// Reply with the player data if they are still online (switching server) // Reply with the player data if they are still online (switching server)
if (Settings.bounceBackSynchronisation) { if (Settings.bounceBackSynchronisation && bounceBack) {
try { try {
ProxiedPlayer player = ProxyServer.getInstance().getPlayer(playerData.getPlayerUUID()); ProxiedPlayer player = ProxyServer.getInstance().getPlayer(playerData.getPlayerUUID());
if (player != null) { if (player != null) {

@ -70,8 +70,8 @@ public class Settings {
public static boolean syncAdvancements; public static boolean syncAdvancements;
public static boolean syncLocation; public static boolean syncLocation;
public static boolean syncFlight; public static boolean syncFlight;
public static long synchronizationTimeoutRetryDelay; public static long synchronizationTimeoutRetryDelay;
public static boolean saveOnWorldSave;
public static boolean useNativeImplementation; public static boolean useNativeImplementation;
// This Cluster ID // This Cluster ID

@ -89,7 +89,8 @@ public class VelocityRedisListener extends RedisListener {
case PLAYER_DATA_UPDATE -> plugin.getProxyServer().getScheduler().buildTask(plugin, () -> { case PLAYER_DATA_UPDATE -> plugin.getProxyServer().getScheduler().buildTask(plugin, () -> {
// Deserialize the PlayerData received // Deserialize the PlayerData received
PlayerData playerData; PlayerData playerData;
final String serializedPlayerData = message.getMessageData(); final String serializedPlayerData = message.getMessageDataElements()[0];
final boolean bounceBack = Boolean.parseBoolean(message.getMessageDataElements()[1]);
try { try {
playerData = (PlayerData) RedisMessage.deserialize(serializedPlayerData); playerData = (PlayerData) RedisMessage.deserialize(serializedPlayerData);
} catch (IOException | ClassNotFoundException e) { } catch (IOException | ClassNotFoundException e) {
@ -107,7 +108,7 @@ public class VelocityRedisListener extends RedisListener {
} }
// Reply with the player data if they are still online (switching server) // Reply with the player data if they are still online (switching server)
if (Settings.bounceBackSynchronisation) { if (Settings.bounceBackSynchronisation && bounceBack) {
Optional<Player> updatingPlayer = plugin.getProxyServer().getPlayer(playerData.getPlayerUUID()); Optional<Player> updatingPlayer = plugin.getProxyServer().getPlayer(playerData.getPlayerUUID());
updatingPlayer.ifPresent(player -> { updatingPlayer.ifPresent(player -> {
try { try {

Loading…
Cancel
Save