diff --git a/lib/MMOLib.jar b/lib/MMOLib.jar index ab582917..32ca38c5 100644 Binary files a/lib/MMOLib.jar and b/lib/MMOLib.jar differ diff --git a/src/main/java/net/Indyuce/mmocore/MMOCore.java b/src/main/java/net/Indyuce/mmocore/MMOCore.java index c4e34745..8909bbe3 100644 --- a/src/main/java/net/Indyuce/mmocore/MMOCore.java +++ b/src/main/java/net/Indyuce/mmocore/MMOCore.java @@ -352,7 +352,7 @@ public class MMOCore extends JavaPlugin { new BukkitRunnable() { public void run() { for (PlayerData loaded : PlayerData.getAll()) - dataProvider.getDataManager().saveData(loaded); + if(loaded.isFullyLoaded()) dataProvider.getDataManager().saveData(loaded); for (Guild guild : dataProvider.getGuildManager().getAll()) dataProvider.getGuildManager().save(guild); @@ -363,6 +363,7 @@ public class MMOCore extends JavaPlugin { public void onDisable() { for (PlayerData data : PlayerData.getAll()) { + if(!data.isFullyLoaded()) return; data.getQuestData().resetBossBar(); dataProvider.getDataManager().saveData(data); } diff --git a/src/main/java/net/Indyuce/mmocore/api/block/BlockInfo.java b/src/main/java/net/Indyuce/mmocore/api/block/BlockInfo.java index b15531ea..85fdcca4 100644 --- a/src/main/java/net/Indyuce/mmocore/api/block/BlockInfo.java +++ b/src/main/java/net/Indyuce/mmocore/api/block/BlockInfo.java @@ -5,8 +5,12 @@ import java.util.List; import java.util.Optional; import java.util.logging.Level; +import net.mmogroup.mmolib.UtilityMethods; +import net.mmogroup.mmolib.api.condition.BlockCondition; +import net.mmogroup.mmolib.api.condition.MMOCondition; import org.apache.commons.lang.Validate; import org.bukkit.Location; +import org.bukkit.block.Block; import org.bukkit.block.data.BlockData; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.inventory.ItemStack; @@ -24,6 +28,7 @@ public class BlockInfo { private final boolean vanillaDrops; private final List triggers = new ArrayList<>(); private final RegenInfo regen; + private final List conditions = new ArrayList<>(); /* * saved separately because MMOCore needs to display the experience gained, @@ -56,6 +61,13 @@ public class BlockInfo { Optional opt = triggers.stream().filter(trigger -> (trigger instanceof ExperienceTrigger)).findFirst(); experience = (ExperienceTrigger) opt.orElse(null); + + if(config.isList("conditions")) + for(String key : config.getStringList("conditions")) { + MMOCondition condition = UtilityMethods.getCondition(key); + if(condition instanceof BlockCondition) conditions.add((BlockCondition) condition); + } + } public boolean hasVanillaDrops() { @@ -110,6 +122,13 @@ public class BlockInfo { return triggers; } + public boolean checkConditions(Block block) { + for(BlockCondition condition : conditions) + if(!condition.check(block)) return false; + + return true; + } + public static class RegeneratingBlock { private final BlockData data; private final Location loc; diff --git a/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java b/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java index 116b1469..9cd325bc 100644 --- a/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java +++ b/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java @@ -96,6 +96,8 @@ public class PlayerData extends OfflinePlayerData { public boolean nocd; public CombatRunnable combat; + private boolean fullyLoaded = false; + public PlayerData(MMOPlayerData mmoData) { super(mmoData.getUniqueId()); @@ -581,6 +583,14 @@ public class PlayerData extends OfflinePlayerData { stellium = Math.max(0, Math.min(amount, getStats().getStat(StatType.MAX_STELLIUM))); } + public boolean isFullyLoaded() { + return fullyLoaded; + } + + public void setFullyLoaded() { + this.fullyLoaded = true; + } + public boolean isCasting() { return skillCasting != null; } diff --git a/src/main/java/net/Indyuce/mmocore/listener/BlockListener.java b/src/main/java/net/Indyuce/mmocore/listener/BlockListener.java index dfb76463..3a48d3ea 100644 --- a/src/main/java/net/Indyuce/mmocore/listener/BlockListener.java +++ b/src/main/java/net/Indyuce/mmocore/listener/BlockListener.java @@ -51,7 +51,7 @@ public class BlockListener implements Listener { */ BlockInfo info = MMOCore.plugin.mineManager.getInfo(block); boolean temporaryBlock = MMOCore.plugin.mineManager.isTemporaryBlock(block); - if (temporaryBlock && info == null) { + if ((temporaryBlock && info == null) || !info.checkConditions(block)) { event.setCancelled(true); return; } diff --git a/src/main/java/net/Indyuce/mmocore/listener/SpellCast.java b/src/main/java/net/Indyuce/mmocore/listener/SpellCast.java index 5d09e644..537ae3cc 100644 --- a/src/main/java/net/Indyuce/mmocore/listener/SpellCast.java +++ b/src/main/java/net/Indyuce/mmocore/listener/SpellCast.java @@ -101,7 +101,7 @@ public class SpellCast implements Listener { ? MMOCore.plugin.configManager.sneakingSwapAction : MMOCore.plugin.configManager.normalSwapAction; if(action != ConfigManager.SwapAction.SPELL_CAST || !playerData.isOnline()) return; - if (event.getPlayer().equals(playerData.getPlayer()) && !player.isSneaking()) { + if (event.getPlayer().equals(playerData.getPlayer())) { MMOCore.plugin.soundManager.play(player, SoundManager.SoundEvent.SPELL_CAST_END); MMOCore.plugin.configManager.getSimpleMessage("casting.no-longer").send(playerData.getPlayer()); close(); diff --git a/src/main/java/net/Indyuce/mmocore/manager/data/PlayerDataManager.java b/src/main/java/net/Indyuce/mmocore/manager/data/PlayerDataManager.java index 6a638b9f..e653e3e1 100644 --- a/src/main/java/net/Indyuce/mmocore/manager/data/PlayerDataManager.java +++ b/src/main/java/net/Indyuce/mmocore/manager/data/PlayerDataManager.java @@ -47,8 +47,12 @@ public abstract class PlayerDataManager { */ Bukkit.getScheduler().runTaskAsynchronously(MMOCore.plugin, () -> { PlayerData loaded = PlayerData.get(uuid); + if(!loaded.isOnline()) return; loadData(loaded); - Bukkit.getScheduler().runTask(MMOCore.plugin, () -> Bukkit.getPluginManager().callEvent(new PlayerDataLoadEvent(loaded))); + Bukkit.getScheduler().runTask(MMOCore.plugin, () -> { + if(loaded.isOnline()) + Bukkit.getPluginManager().callEvent(new PlayerDataLoadEvent(loaded)); + }); loaded.getStats().updateStats(); }); } diff --git a/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLPlayerDataManager.java b/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLPlayerDataManager.java index 68c4767d..11de26de 100644 --- a/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLPlayerDataManager.java +++ b/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLPlayerDataManager.java @@ -105,6 +105,7 @@ public class MySQLPlayerDataManager extends PlayerDataManager { } } } + data.setFullyLoaded(); } catch (SQLException e) { e.printStackTrace(); } @@ -249,7 +250,7 @@ public class MySQLPlayerDataManager extends PlayerDataManager { @Override public void remove(PlayerData data) { - saveData(data); + if(data.isFullyLoaded()) saveData(data); remove(data.getUniqueId()); } } diff --git a/src/main/java/net/Indyuce/mmocore/manager/data/yaml/YAMLPlayerDataManager.java b/src/main/java/net/Indyuce/mmocore/manager/data/yaml/YAMLPlayerDataManager.java index 3d95c6c1..cc0e4f4b 100644 --- a/src/main/java/net/Indyuce/mmocore/manager/data/yaml/YAMLPlayerDataManager.java +++ b/src/main/java/net/Indyuce/mmocore/manager/data/yaml/YAMLPlayerDataManager.java @@ -67,6 +67,7 @@ public class YAMLPlayerDataManager extends PlayerDataManager { } catch (IllegalArgumentException exception) { MMOCore.log(Level.WARNING, "Could not load class info '" + key + "': " + exception.getMessage()); } + data.setFullyLoaded(); } @Override