From 5c158c66e4c365636f51ad2bf07edfc6ab25d491 Mon Sep 17 00:00:00 2001 From: Daniel Saukel Date: Sun, 17 Feb 2019 16:47:39 +0100 Subject: [PATCH] Handle flight, invulnerability and collidability on save / reset; resolves #535 --- .../dungeonsxl/player/DGlobalPlayer.java | 6 ++ .../dungeonsxl/player/DInstancePlayer.java | 5 ++ .../dungeonsxl/player/DPlayerData.java | 60 +++++++++++++++++++ 3 files changed, 71 insertions(+) diff --git a/src/main/java/de/erethon/dungeonsxl/player/DGlobalPlayer.java b/src/main/java/de/erethon/dungeonsxl/player/DGlobalPlayer.java index b6879054..ff4ad17c 100644 --- a/src/main/java/de/erethon/dungeonsxl/player/DGlobalPlayer.java +++ b/src/main/java/de/erethon/dungeonsxl/player/DGlobalPlayer.java @@ -363,6 +363,12 @@ public class DGlobalPlayer implements PlayerWrapper { player.addPotionEffects(data.getOldPotionEffects()); + if (is1_9) { + player.setCollidable(data.getOldCollidabilityState()); + player.setInvulnerable(data.getOldInvulnerabilityState()); + } + player.setAllowFlight(data.getOldFlyingState()); + } else { for (ItemStack item : player.getInventory().getContents()) { if (item == null) { diff --git a/src/main/java/de/erethon/dungeonsxl/player/DInstancePlayer.java b/src/main/java/de/erethon/dungeonsxl/player/DInstancePlayer.java index 81c8c990..4ab1bb51 100644 --- a/src/main/java/de/erethon/dungeonsxl/player/DInstancePlayer.java +++ b/src/main/java/de/erethon/dungeonsxl/player/DInstancePlayer.java @@ -81,6 +81,11 @@ public abstract class DInstancePlayer extends DGlobalPlayer { for (PotionEffect effect : player.getActivePotionEffects()) { player.removePotionEffect(effect.getType()); } + if (is1_9) { + player.setCollidable(true); + player.setInvulnerable(false); + } + player.setAllowFlight(false); } /** diff --git a/src/main/java/de/erethon/dungeonsxl/player/DPlayerData.java b/src/main/java/de/erethon/dungeonsxl/player/DPlayerData.java index 2acb337d..b558884a 100644 --- a/src/main/java/de/erethon/dungeonsxl/player/DPlayerData.java +++ b/src/main/java/de/erethon/dungeonsxl/player/DPlayerData.java @@ -66,6 +66,9 @@ public class DPlayerData extends DREConfig { private int oldFireTicks; private GameMode oldGameMode; private Collection oldPotionEffects; + private boolean oldCollidabilityState; + private boolean oldFlyingState; + private boolean oldInvulnerabilityState; // Stats private Map timeLastStarted = new HashMap<>(); @@ -277,6 +280,48 @@ public class DPlayerData extends DREConfig { oldPotionEffects = potionEffects; } + /** + * @return if the player was collidable + */ + public boolean getOldCollidabilityState() { + return oldCollidabilityState; + } + + /** + * @param collidableState the collidable state to set + */ + public void setOldCollidabilityState(boolean collidableState) { + oldCollidabilityState = collidableState; + } + + /** + * @return if the player was flying + */ + public boolean getOldFlyingState() { + return oldFlyingState; + } + + /** + * @param flyingState the flying state to set + */ + public void setOldFlyingState(boolean flyingState) { + oldFlyingState = flyingState; + } + + /** + * @return if the player was invulnerable + */ + public boolean getOldInvulnerabilityState() { + return oldInvulnerabilityState; + } + + /** + * @param invulnerabilityState the invulnerability state to set + */ + public void setOldInvulnerabilityState(boolean invulnerabilityState) { + oldFlyingState = invulnerabilityState; + } + /** * @return a map of the player's started dungeons with dates. */ @@ -476,6 +521,10 @@ public class DPlayerData extends DREConfig { } catch (IllegalArgumentException exception) { oldLocation = Bukkit.getWorlds().get(0).getSpawnLocation(); } + + oldCollidabilityState = config.getBoolean(PREFIX_STATE_PERSISTENCE + "oldCollidabilityState", true); + oldFlyingState = config.getBoolean(PREFIX_STATE_PERSISTENCE + "oldFlyingState", false); + oldInvulnerabilityState = config.getBoolean(PREFIX_STATE_PERSISTENCE + "oldInvulnerabilityState", false); } @Override @@ -509,6 +558,11 @@ public class DPlayerData extends DREConfig { } oldLocation = player.getLocation(); oldPotionEffects = player.getActivePotionEffects(); + if (is1_9) { + oldCollidabilityState = player.isCollidable(); + oldInvulnerabilityState = player.isInvulnerable(); + } + oldFlyingState = player.getAllowFlight(); config.set(PREFIX_STATE_PERSISTENCE + "oldGameMode", oldGameMode.toString()); config.set(PREFIX_STATE_PERSISTENCE + "oldFireTicks", oldFireTicks); @@ -522,6 +576,9 @@ public class DPlayerData extends DREConfig { config.set(PREFIX_STATE_PERSISTENCE + "oldOffHand", oldOffHand); config.set(PREFIX_STATE_PERSISTENCE + "oldLocation", oldLocation); config.set(PREFIX_STATE_PERSISTENCE + "oldPotionEffects", oldPotionEffects); + config.set(PREFIX_STATE_PERSISTENCE + "oldCollidabilityState", oldCollidabilityState); + config.set(PREFIX_STATE_PERSISTENCE + "oldFlyingState", oldFlyingState); + config.set(PREFIX_STATE_PERSISTENCE + "oldInvulnerabilityState", oldInvulnerabilityState); save(); } @@ -542,6 +599,9 @@ public class DPlayerData extends DREConfig { oldOffHand = null; oldLocation = null; oldPotionEffects = null; + oldCollidabilityState = true; + oldFlyingState = false; + oldInvulnerabilityState = false; if (wasInGame()) { config.set("savePlayer", null);