Add experience synchronisation

feat/data-edit-commands
William 3 years ago
parent 9198cd648f
commit 99ce0898da

@ -29,6 +29,7 @@ public class PlayerSetter {
player.setSaturation(data.getSaturation()); player.setSaturation(data.getSaturation());
player.setExhaustion(data.getSaturationExhaustion()); player.setExhaustion(data.getSaturationExhaustion());
player.getInventory().setHeldItemSlot(data.getSelectedSlot()); player.getInventory().setHeldItemSlot(data.getSelectedSlot());
player.setTotalExperience(data.getExperience());
//todo potion effects not working //todo potion effects not working
setPlayerPotionEffects(player, DataSerializer.potionEffectArrayFromBase64(data.getSerializedEffectData())); setPlayerPotionEffects(player, DataSerializer.potionEffectArrayFromBase64(data.getSerializedEffectData()));

@ -35,7 +35,8 @@ public class EventListener implements Listener {
player.getSaturation(), player.getSaturation(),
player.getExhaustion(), player.getExhaustion(),
player.getInventory().getHeldItemSlot(), player.getInventory().getHeldItemSlot(),
DataSerializer.getSerializedEffectData(player))); DataSerializer.getSerializedEffectData(player),
player.getTotalExperience()));
} }
@EventHandler @EventHandler

@ -76,8 +76,9 @@ public class DataManager {
final float saturationExhaustion = resultSet.getFloat("saturation_exhaustion"); final float saturationExhaustion = resultSet.getFloat("saturation_exhaustion");
final int selectedSlot = resultSet.getInt("selected_slot"); final int selectedSlot = resultSet.getInt("selected_slot");
final String serializedStatusEffects = resultSet.getString("status_effects"); final String serializedStatusEffects = resultSet.getString("status_effects");
final int experience = resultSet.getInt("experience");
return new PlayerData(playerUUID, dataVersionUUID, serializedInventory, serializedEnderChest, health, maxHealth, hunger, saturation, saturationExhaustion, selectedSlot, serializedStatusEffects); return new PlayerData(playerUUID, dataVersionUUID, serializedInventory, serializedEnderChest, health, maxHealth, hunger, saturation, saturationExhaustion, selectedSlot, serializedStatusEffects, experience);
} else { } else {
return PlayerData.DEFAULT_PLAYER_DATA(playerUUID); return PlayerData.DEFAULT_PLAYER_DATA(playerUUID);
} }
@ -105,7 +106,7 @@ public class DataManager {
private static void updatePlayerSQLData(PlayerData playerData) { private static void updatePlayerSQLData(PlayerData playerData) {
try (Connection connection = CrossServerSyncBungeeCord.getConnection()) { try (Connection connection = CrossServerSyncBungeeCord.getConnection()) {
try (PreparedStatement statement = connection.prepareStatement( try (PreparedStatement statement = connection.prepareStatement(
"UPDATE " + Database.DATA_TABLE_NAME + " SET `version_uuid`=?, `timestamp`=?, `inventory`=?, `ender_chest`=?, `health`=?, `max_health`=?, `hunger`=?, `saturation`=?, `saturation_exhaustion`=?, `selected_slot`=?, `status_effects`=? WHERE `player_id`=(SELECT `id` FROM " + Database.PLAYER_TABLE_NAME + " WHERE `uuid`=?);")) { "UPDATE " + Database.DATA_TABLE_NAME + " SET `version_uuid`=?, `timestamp`=?, `inventory`=?, `ender_chest`=?, `health`=?, `max_health`=?, `hunger`=?, `saturation`=?, `saturation_exhaustion`=?, `selected_slot`=?, `status_effects`=?, `experience`=? WHERE `player_id`=(SELECT `id` FROM " + Database.PLAYER_TABLE_NAME + " WHERE `uuid`=?);")) {
statement.setString(1, playerData.getDataVersionUUID().toString()); statement.setString(1, playerData.getDataVersionUUID().toString());
statement.setTimestamp(2, new Timestamp(Instant.now().getEpochSecond())); statement.setTimestamp(2, new Timestamp(Instant.now().getEpochSecond()));
statement.setString(3, playerData.getSerializedInventory()); statement.setString(3, playerData.getSerializedInventory());
@ -117,7 +118,8 @@ public class DataManager {
statement.setFloat(9, playerData.getSaturationExhaustion()); // Saturation exhaustion statement.setFloat(9, playerData.getSaturationExhaustion()); // Saturation exhaustion
statement.setInt(10, playerData.getSelectedSlot()); // Current selected slot statement.setInt(10, playerData.getSelectedSlot()); // Current selected slot
statement.setString(11, playerData.getSerializedEffectData()); // Status effects statement.setString(11, playerData.getSerializedEffectData()); // Status effects
statement.setString(12, playerData.getPlayerUUID().toString()); statement.setInt(12, playerData.getExperience()); // Experience
statement.setString(13, playerData.getPlayerUUID().toString());
statement.executeUpdate(); statement.executeUpdate();
} }
} catch (SQLException e) { } catch (SQLException e) {
@ -128,7 +130,7 @@ public class DataManager {
private static void insertPlayerData(PlayerData playerData) { private static void insertPlayerData(PlayerData playerData) {
try (Connection connection = CrossServerSyncBungeeCord.getConnection()) { try (Connection connection = CrossServerSyncBungeeCord.getConnection()) {
try (PreparedStatement statement = connection.prepareStatement( try (PreparedStatement statement = connection.prepareStatement(
"INSERT INTO " + Database.DATA_TABLE_NAME + " (`player_id`,`version_uuid`,`timestamp`,`inventory`,`ender_chest`,`health`,`max_health`,`hunger`,`saturation`,`saturation_exhaustion`,`selected_slot`,`status_effects`) VALUES((SELECT `id` FROM " + Database.PLAYER_TABLE_NAME + " WHERE `uuid`=?),?,?,?,?,?,?,?,?,?,?,?);")) { "INSERT INTO " + Database.DATA_TABLE_NAME + " (`player_id`,`version_uuid`,`timestamp`,`inventory`,`ender_chest`,`health`,`max_health`,`hunger`,`saturation`,`saturation_exhaustion`,`selected_slot`,`status_effects`,`experience`) VALUES((SELECT `id` FROM " + Database.PLAYER_TABLE_NAME + " WHERE `uuid`=?),?,?,?,?,?,?,?,?,?,?,?,?);")) {
statement.setString(1, playerData.getPlayerUUID().toString()); statement.setString(1, playerData.getPlayerUUID().toString());
statement.setString(2, playerData.getDataVersionUUID().toString()); statement.setString(2, playerData.getDataVersionUUID().toString());
statement.setTimestamp(3, new Timestamp(Instant.now().getEpochSecond())); statement.setTimestamp(3, new Timestamp(Instant.now().getEpochSecond()));
@ -141,6 +143,7 @@ public class DataManager {
statement.setFloat(10, playerData.getSaturationExhaustion()); // Saturation exhaustion statement.setFloat(10, playerData.getSaturationExhaustion()); // Saturation exhaustion
statement.setInt(11, playerData.getSelectedSlot()); // Current selected slot statement.setInt(11, playerData.getSelectedSlot()); // Current selected slot
statement.setString(12, playerData.getSerializedEffectData()); // Status effects statement.setString(12, playerData.getSerializedEffectData()); // Status effects
statement.setInt(13, playerData.getExperience()); // Experience
statement.executeUpdate(); statement.executeUpdate();
} }

@ -32,6 +32,7 @@ public class MySQL extends Database {
"`saturation_exhaustion` float NOT NULL," + "`saturation_exhaustion` float NOT NULL," +
"`selected_slot` integer NOT NULL," + "`selected_slot` integer NOT NULL," +
"`status_effects` longtext NOT NULL," + "`status_effects` longtext NOT NULL," +
"`experience` integer NOT NULL," +
"PRIMARY KEY (`player_id`,`uuid`)," + "PRIMARY KEY (`player_id`,`uuid`)," +
"FOREIGN KEY (`player_id`) REFERENCES " + PLAYER_TABLE_NAME + " (`id`)" + "FOREIGN KEY (`player_id`) REFERENCES " + PLAYER_TABLE_NAME + " (`id`)" +

@ -40,6 +40,7 @@ public class SQLite extends Database {
"`saturation_exhaustion` float NOT NULL," + "`saturation_exhaustion` float NOT NULL," +
"`selected_slot` integer NOT NULL," + "`selected_slot` integer NOT NULL," +
"`status_effects` longtext NOT NULL," + "`status_effects` longtext NOT NULL," +
"`experience` integer NOT NULL," +
"PRIMARY KEY (`player_id`,`version_uuid`)" + "PRIMARY KEY (`player_id`,`version_uuid`)" +
");" ");"

@ -22,11 +22,12 @@ public class BungeeRedisListener extends RedisListener {
} }
private PlayerData getPlayerCachedData(UUID uuid) { private PlayerData getPlayerCachedData(UUID uuid) {
for (PlayerData data : DataManager.playerDataCache.playerData) { // Get the player data from the cache
if (data.getPlayerUUID() == uuid) { PlayerData cachedData = DataManager.playerDataCache.getPlayer(uuid);
return data; if (cachedData != null) {
} return cachedData;
} }
// If the cache does not contain player data: // If the cache does not contain player data:
DataManager.ensurePlayerExists(uuid); // Make sure the player is registered on MySQL DataManager.ensurePlayerExists(uuid); // Make sure the player is registered on MySQL

@ -26,6 +26,7 @@ public class PlayerData implements Serializable {
private final float saturationExhaustion; private final float saturationExhaustion;
private final int selectedSlot; private final int selectedSlot;
private final String serializedEffectData; private final String serializedEffectData;
private final int experience;
/** /**
* Create a new PlayerData object; a random data version UUID will be selected. * Create a new PlayerData object; a random data version UUID will be selected.
@ -39,7 +40,7 @@ public class PlayerData implements Serializable {
* @param selectedSlot Player selected slot * @param selectedSlot Player selected slot
* @param serializedStatusEffects Serialized status effect data * @param serializedStatusEffects Serialized status effect data
*/ */
public PlayerData(UUID playerUUID, String serializedInventory, String serializedEnderChest, double health, double maxHealth, int hunger, float saturation, float saturationExhaustion, int selectedSlot, String serializedStatusEffects) { public PlayerData(UUID playerUUID, String serializedInventory, String serializedEnderChest, double health, double maxHealth, int hunger, float saturation, float saturationExhaustion, int selectedSlot, String serializedStatusEffects, int experience) {
this.dataVersionUUID = UUID.randomUUID(); this.dataVersionUUID = UUID.randomUUID();
this.playerUUID = playerUUID; this.playerUUID = playerUUID;
this.serializedInventory = serializedInventory; this.serializedInventory = serializedInventory;
@ -51,9 +52,10 @@ public class PlayerData implements Serializable {
this.saturationExhaustion = saturationExhaustion; this.saturationExhaustion = saturationExhaustion;
this.selectedSlot = selectedSlot; this.selectedSlot = selectedSlot;
this.serializedEffectData = serializedStatusEffects; this.serializedEffectData = serializedStatusEffects;
this.experience = experience;
} }
public PlayerData(UUID playerUUID, UUID dataVersionUUID, String serializedInventory, String serializedEnderChest, double health, double maxHealth, int hunger, float saturation, float saturationExhaustion, int selectedSlot, String serializedStatusEffects) { public PlayerData(UUID playerUUID, UUID dataVersionUUID, String serializedInventory, String serializedEnderChest, double health, double maxHealth, int hunger, float saturation, float saturationExhaustion, int selectedSlot, String serializedStatusEffects, int experience) {
this.playerUUID = playerUUID; this.playerUUID = playerUUID;
this.dataVersionUUID = dataVersionUUID; this.dataVersionUUID = dataVersionUUID;
this.serializedInventory = serializedInventory; this.serializedInventory = serializedInventory;
@ -65,11 +67,12 @@ public class PlayerData implements Serializable {
this.saturationExhaustion = saturationExhaustion; this.saturationExhaustion = saturationExhaustion;
this.selectedSlot = selectedSlot; this.selectedSlot = selectedSlot;
this.serializedEffectData = serializedStatusEffects; this.serializedEffectData = serializedStatusEffects;
this.experience = experience;
} }
public static PlayerData DEFAULT_PLAYER_DATA(UUID playerUUID) { public static PlayerData DEFAULT_PLAYER_DATA(UUID playerUUID) {
return new PlayerData(playerUUID, "", "", 20, return new PlayerData(playerUUID, "", "", 20,
20, 20, 10, 1, 0, ""); 20, 20, 10, 1, 0, "", 0);
} }
public UUID getPlayerUUID() { public UUID getPlayerUUID() {
@ -113,4 +116,6 @@ public class PlayerData implements Serializable {
public String getSerializedEffectData() { public String getSerializedEffectData() {
return serializedEffectData; return serializedEffectData;
} }
public int getExperience() { return experience; }
} }

Loading…
Cancel
Save