diff --git a/src/main/java/eu/endermite/togglepvp/TogglePvP.java b/src/main/java/eu/endermite/togglepvp/TogglePvP.java index d951191..10917d9 100644 --- a/src/main/java/eu/endermite/togglepvp/TogglePvP.java +++ b/src/main/java/eu/endermite/togglepvp/TogglePvP.java @@ -6,6 +6,7 @@ import eu.endermite.togglepvp.listeners.player.*; import eu.endermite.togglepvp.listeners.wolf.WolfAttackPlayerListener; import eu.endermite.togglepvp.listeners.wolf.WolfTargettingListener; import eu.endermite.togglepvp.players.PlayerManager; +import eu.endermite.togglepvp.players.SmartCache; import eu.endermite.togglepvp.util.DatabaseSQLite; import lombok.Getter; import org.bukkit.command.CommandSender; @@ -31,6 +32,8 @@ public final class TogglePvP extends JavaPlugin { sqLite.testConnection(); playerManager = new PlayerManager(); + SmartCache.runSmartCache(); + getServer().getPluginManager().registerEvents(new PlayerJoinAndLeaveListener(), this); getServer().getPluginManager().registerEvents(new PlayerAttackListener(), this); getServer().getPluginManager().registerEvents(new PlayerHitByProjectileListener(), this); diff --git a/src/main/java/eu/endermite/togglepvp/commands/PvpToggleCommand.java b/src/main/java/eu/endermite/togglepvp/commands/PvpToggleCommand.java index 8a395a4..d4a4c14 100644 --- a/src/main/java/eu/endermite/togglepvp/commands/PvpToggleCommand.java +++ b/src/main/java/eu/endermite/togglepvp/commands/PvpToggleCommand.java @@ -25,7 +25,7 @@ public class PvpToggleCommand { if (args.length == 1) { if (sender instanceof Player) { Player player = (Player) sender; - boolean currentState = TogglePvP.getPlugin().getPlayerManager().togglePlayerPvpState(player); + boolean currentState = TogglePvP.getPlugin().getPlayerManager().togglePlayerPvpState(player.getUniqueId()); String message = ""; if (currentState) { @@ -47,7 +47,7 @@ public class PvpToggleCommand { } try { Player player = Bukkit.getPlayer(args[1]); - boolean currentState = TogglePvP.getPlugin().getPlayerManager().togglePlayerPvpState(player); + boolean currentState = TogglePvP.getPlugin().getPlayerManager().togglePlayerPvpState(player.getUniqueId()); String message; if (currentState) { message = TogglePvP.getPlugin().getConfigCache().getPvp_enabled_other(); @@ -79,7 +79,7 @@ public class PvpToggleCommand { if (args.length == 1) { if (sender instanceof Player) { Player player = (Player) sender; - TogglePvP.getPlugin().getPlayerManager().setPlayerPvpState(player, true); + TogglePvP.getPlugin().getPlayerManager().setPlayerPvpState(player.getUniqueId(), true); String message = PluginMessages.parseMessage(TogglePvP.getPlugin().getConfigCache().getPvp_enabled()); BaseComponent[] component = TextComponent.fromLegacyText(message); player.spigot().sendMessage(ChatMessageType.CHAT, component); @@ -97,7 +97,7 @@ public class PvpToggleCommand { Player player = Bukkit.getPlayer(args[1]); String message = TogglePvP.getPlugin().getConfigCache().getPvp_enabled_other(); sender.sendMessage(PluginMessages.parsePlayerName(player, message)); - TogglePvP.getPlugin().getPlayerManager().setPlayerPvpState(player, true); + TogglePvP.getPlugin().getPlayerManager().setPlayerPvpState(player.getUniqueId(), true); } catch (NullPointerException e) { sender.sendMessage(PluginMessages.parseMessage("&cPlayer offline.")); } @@ -120,7 +120,7 @@ public class PvpToggleCommand { if (args.length == 1) { if (sender instanceof Player) { Player player = (Player) sender; - TogglePvP.getPlugin().getPlayerManager().setPlayerPvpState(player, false); + TogglePvP.getPlugin().getPlayerManager().setPlayerPvpState(player.getUniqueId(), false); String message = PluginMessages.parseMessage(TogglePvP.getPlugin().getConfigCache().getPvp_disabled()); BaseComponent[] component = TextComponent.fromLegacyText(message); player.spigot().sendMessage(ChatMessageType.CHAT, component); @@ -138,7 +138,7 @@ public class PvpToggleCommand { Player player = Bukkit.getPlayer(args[1]); String message = TogglePvP.getPlugin().getConfigCache().getPvp_disabled_other(); sender.sendMessage(PluginMessages.parsePlayerName(player, message)); - TogglePvP.getPlugin().getPlayerManager().setPlayerPvpState(player, true); + TogglePvP.getPlugin().getPlayerManager().setPlayerPvpState(player.getUniqueId(), true); } catch (NullPointerException e) { sender.sendMessage(PluginMessages.parseMessage("&cPlayer offline.")); } diff --git a/src/main/java/eu/endermite/togglepvp/config/ConfigCache.java b/src/main/java/eu/endermite/togglepvp/config/ConfigCache.java index 8254de6..4fda211 100644 --- a/src/main/java/eu/endermite/togglepvp/config/ConfigCache.java +++ b/src/main/java/eu/endermite/togglepvp/config/ConfigCache.java @@ -18,6 +18,7 @@ public class ConfigCache { @Getter private final String pvp_disabled_other; @Getter private final double lava_and_fire_stopper_radius; @Getter private final boolean channeling_enchant_disabled; + @Getter private final long cache_time; public ConfigCache() { @@ -29,7 +30,9 @@ public class ConfigCache { this.lava_and_fire_stopper_enabled = config.getBoolean("settings.lava_and_fire_stopper.enabled", true); this.lava_and_fire_stopper_radius = config.getDouble("settings.lava_and_fire_stopper.radius", 2.5); - this.channeling_enchant_disabled = config.getBoolean("channeling_enchant_disabled", true); + this.channeling_enchant_disabled = config.getBoolean("settings.channeling_enchant_disabled", true); + + this.cache_time = config.getLong("settings.cache_time", 30L); // Messages this.pvp_enabled = config.getString("messages.pvp_enabled", "&cYou enabled PvP!"); diff --git a/src/main/java/eu/endermite/togglepvp/listeners/player/AreaEffectCloudApplyListener.java b/src/main/java/eu/endermite/togglepvp/listeners/player/AreaEffectCloudApplyListener.java index cfca8d3..c7b374a 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/player/AreaEffectCloudApplyListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/player/AreaEffectCloudApplyListener.java @@ -43,13 +43,13 @@ public class AreaEffectCloudApplyListener implements Listener { continue; ConfigCache config = TogglePvP.getPlugin().getConfigCache(); - boolean damagerPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(damager); + boolean damagerPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(damager.getUniqueId()); if (!damagerPvpEnabled) { it.remove(); PluginMessages.sendActionBar(damager, config.getCannot_attack_attacker()); continue; } - boolean victimPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(victim); + boolean victimPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(victim.getUniqueId()); if (!victimPvpEnabled) { it.remove(); PluginMessages.sendActionBar(damager, config.getCannot_attack_victim()); diff --git a/src/main/java/eu/endermite/togglepvp/listeners/player/FishingListener.java b/src/main/java/eu/endermite/togglepvp/listeners/player/FishingListener.java index 29cff97..d8ef827 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/player/FishingListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/player/FishingListener.java @@ -24,8 +24,8 @@ public class FishingListener implements Listener { } ConfigCache config = TogglePvP.getPlugin().getConfigCache(); - boolean damagerPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(damager); - boolean victimPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(victim); + boolean damagerPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(damager.getUniqueId()); + boolean victimPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(victim.getUniqueId()); if (!damagerPvpEnabled) { event.setCancelled(true); PluginMessages.sendActionBar(damager, config.getCannot_attack_attacker()); diff --git a/src/main/java/eu/endermite/togglepvp/listeners/player/LavaDumpAndIgniteListener.java b/src/main/java/eu/endermite/togglepvp/listeners/player/LavaDumpAndIgniteListener.java index 167d720..e8d9421 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/player/LavaDumpAndIgniteListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/player/LavaDumpAndIgniteListener.java @@ -35,13 +35,13 @@ public class LavaDumpAndIgniteListener implements Listener { if (entity instanceof Player) { Player victim = (Player) entity; if (victim != damager) { - boolean damagerPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(damager); + boolean damagerPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(damager.getUniqueId()); if (!damagerPvpEnabled) { PluginMessages.sendActionBar(damager, config.getCannot_attack_attacker()); event.setCancelled(true); return; } - boolean victimPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(victim); + boolean victimPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(victim.getUniqueId()); if (!victimPvpEnabled) { PluginMessages.sendActionBar(damager, config.getCannot_attack_victim()); event.setCancelled(true); @@ -71,13 +71,13 @@ public class LavaDumpAndIgniteListener implements Listener { if (entity instanceof Player) { Player victim = (Player) entity; if (victim != damager) { - boolean damagerPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(damager); + boolean damagerPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(damager.getUniqueId()); if (!damagerPvpEnabled) { PluginMessages.sendActionBar(damager, config.getCannot_attack_attacker()); event.setCancelled(true); return; } - boolean victimPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(victim); + boolean victimPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(victim.getUniqueId()); if (!victimPvpEnabled) { PluginMessages.sendActionBar(damager, config.getCannot_attack_victim()); event.setCancelled(true); diff --git a/src/main/java/eu/endermite/togglepvp/listeners/player/LightningBlockIgniteListener.java b/src/main/java/eu/endermite/togglepvp/listeners/player/LightningBlockIgniteListener.java index d3f0151..6f178f6 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/player/LightningBlockIgniteListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/player/LightningBlockIgniteListener.java @@ -23,7 +23,7 @@ public class LightningBlockIgniteListener implements Listener { if (entity instanceof Player) { Player player = (Player) entity; - if (!TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(player)) { + if (!TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(player.getUniqueId())) { event.setCancelled(true); return; } diff --git a/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerAttackListener.java b/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerAttackListener.java index fa0dcc0..b947a2e 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerAttackListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerAttackListener.java @@ -25,8 +25,8 @@ public class PlayerAttackListener implements Listener { ConfigCache config = TogglePvP.getPlugin().getConfigCache(); - boolean damagerPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(damager); - boolean victimPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(victim); + boolean damagerPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(damager.getUniqueId()); + boolean victimPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(victim.getUniqueId()); if (!damagerPvpEnabled) { event.setCancelled(true); diff --git a/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitByExplosionListener.java b/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitByExplosionListener.java index bce8b28..7af89e5 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitByExplosionListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitByExplosionListener.java @@ -35,13 +35,13 @@ public class PlayerHitByExplosionListener implements Listener { Player damager = Bukkit.getPlayer(playeruuid); if (victim != damager) { ConfigCache config = TogglePvP.getPlugin().getConfigCache(); - boolean damagerPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(damager); + boolean damagerPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(damager.getUniqueId()); if (!damagerPvpEnabled) { PluginMessages.sendActionBar(damager, config.getCannot_attack_attacker()); event.setCancelled(true); return; } - boolean victimPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(victim); + boolean victimPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(victim.getUniqueId()); if (!victimPvpEnabled) { PluginMessages.sendActionBar(damager, config.getCannot_attack_victim()); event.setCancelled(true); diff --git a/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitByFireworkListener.java b/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitByFireworkListener.java index 5f42222..c66617f 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitByFireworkListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitByFireworkListener.java @@ -19,7 +19,7 @@ public class PlayerHitByFireworkListener implements Listener { if (damager == victim) { return; } - boolean victimPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(victim); + boolean victimPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(victim.getUniqueId()); if (!victimPvpEnabled) { event.setCancelled(true); } diff --git a/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitByLightningListener.java b/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitByLightningListener.java index d5bf017..c13f2e5 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitByLightningListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitByLightningListener.java @@ -22,7 +22,7 @@ public class PlayerHitByLightningListener implements Listener { public void onPlayerLightningDamage(org.bukkit.event.entity.EntityDamageByEntityEvent event) { if (event.getDamager() instanceof LightningStrike && event.getDamager().getMetadata("TRIDENT").size() >= 1 && event.getEntity() instanceof Player) { Player victim = (Player) event.getEntity(); - boolean victimPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(victim); + boolean victimPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(victim.getUniqueId()); if (!victimPvpEnabled) { event.setCancelled(true); } diff --git a/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitByProjectileListener.java b/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitByProjectileListener.java index fd2f33b..4276fee 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitByProjectileListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitByProjectileListener.java @@ -30,8 +30,8 @@ public class PlayerHitByProjectileListener implements Listener { ConfigCache config = TogglePvP.getPlugin().getConfigCache(); - boolean damagerPvpEnabled = (boolean) TogglePvP.getPlugin().getPlayerManager().getPlayer(damager).get("pvpenabled"); - boolean victimPvpEnabled = (boolean) TogglePvP.getPlugin().getPlayerManager().getPlayer(victim).get("pvpenabled"); + boolean damagerPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(damager.getUniqueId()); + boolean victimPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(victim.getUniqueId()); if (!damagerPvpEnabled) { event.setCancelled(true); diff --git a/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitBySplashPotionListener.java b/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitBySplashPotionListener.java index 4b395f7..5a324ed 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitBySplashPotionListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitBySplashPotionListener.java @@ -49,13 +49,13 @@ public class PlayerHitBySplashPotionListener implements Listener { continue; ConfigCache config = TogglePvP.getPlugin().getConfigCache(); - boolean damagerPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(damager); + boolean damagerPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(damager.getUniqueId()); if (!damagerPvpEnabled) { event.setIntensity(victim, 0); PluginMessages.sendActionBar(damager, config.getCannot_attack_attacker()); continue; } - boolean victimPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(victim); + boolean victimPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(victim.getUniqueId()); if (!victimPvpEnabled) { event.setIntensity(victim, 0); PluginMessages.sendActionBar(damager, config.getCannot_attack_victim()); diff --git a/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerJoinAndLeaveListener.java b/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerJoinAndLeaveListener.java index 1719ba3..d81bd0d 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerJoinAndLeaveListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerJoinAndLeaveListener.java @@ -17,9 +17,9 @@ public class PlayerJoinAndLeaveListener implements Listener { Player player = event.getPlayer(); HashMap playerData; - playerData = TogglePvP.getPlugin().getSqLite().getPlayerInfo(player); - TogglePvP.getPlugin().getPlayerManager().addPlayer(player, playerData); - + playerData = TogglePvP.getPlugin().getSqLite().getPlayerInfo(player.getUniqueId()); + playerData.put("cachetime", TogglePvP.getPlugin().getPlayerManager().refreshedCacheTime()); + TogglePvP.getPlugin().getPlayerManager().addPlayer(player.getUniqueId(), playerData); } /** * This event is here to dump player's saved options from memory @@ -27,8 +27,7 @@ public class PlayerJoinAndLeaveListener implements Listener { @EventHandler public void onPlayerLeave(org.bukkit.event.player.PlayerQuitEvent event) { Player player = event.getPlayer(); - TogglePvP.getPlugin().getSqLite().updatePlayerInfo(player, TogglePvP.getPlugin().getPlayerManager().getPlayer(player)); - TogglePvP.getPlugin().getPlayerManager().removePlayer(player); + TogglePvP.getPlugin().getSqLite().updatePlayerInfo(player.getUniqueId(), TogglePvP.getPlugin().getPlayerManager().getPlayer(player.getUniqueId())); } } diff --git a/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerPlaceWitherRoseListener.java b/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerPlaceWitherRoseListener.java index d1d9413..187297d 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerPlaceWitherRoseListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerPlaceWitherRoseListener.java @@ -34,13 +34,13 @@ public class PlayerPlaceWitherRoseListener implements Listener { Player damager = event.getPlayer(); Player victim = (Player) entity; if (victim != damager) { - boolean damagerPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(damager); + boolean damagerPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(damager.getUniqueId()); if (!damagerPvpEnabled) { PluginMessages.sendActionBar(damager, config.getCannot_attack_attacker()); event.setCancelled(true); return; } - boolean victimPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(victim); + boolean victimPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(victim.getUniqueId()); if (!victimPvpEnabled) { PluginMessages.sendActionBar(damager, config.getCannot_attack_victim()); event.setCancelled(true); diff --git a/src/main/java/eu/endermite/togglepvp/listeners/wolf/WolfAttackPlayerListener.java b/src/main/java/eu/endermite/togglepvp/listeners/wolf/WolfAttackPlayerListener.java index aaa0392..5758674 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/wolf/WolfAttackPlayerListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/wolf/WolfAttackPlayerListener.java @@ -18,8 +18,11 @@ public class WolfAttackPlayerListener implements Listener { if (event.getDamager() instanceof Wolf) { Wolf wolf = (Wolf) event.getDamager(); if (wolf.getOwner() != null && event.getEntity() instanceof Player) { + + //TODO check if offline wolf owner has pvp on or off and cancel this accordingly + Player victim = (Player) event.getEntity(); - boolean victimPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(victim); + boolean victimPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(victim.getUniqueId()); if (!victimPvpEnabled) { wolf.setAngry(false); event.setCancelled(true); diff --git a/src/main/java/eu/endermite/togglepvp/listeners/wolf/WolfTargettingListener.java b/src/main/java/eu/endermite/togglepvp/listeners/wolf/WolfTargettingListener.java index 60f7e76..5b95158 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/wolf/WolfTargettingListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/wolf/WolfTargettingListener.java @@ -20,7 +20,7 @@ public class WolfTargettingListener implements Listener { if (wolf.getOwner() != null) { if (event.getTarget() instanceof Player) { Player victim = (Player) event.getTarget(); - boolean victimPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(victim); + boolean victimPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(victim.getUniqueId()); if (!victimPvpEnabled) { event.setCancelled(true); } @@ -31,7 +31,7 @@ public class WolfTargettingListener implements Listener { if (fox.getFirstTrustedPlayer() != null) { if (event.getTarget() instanceof Player) { Player victim = (Player) event.getTarget(); - boolean victimPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(victim); + boolean victimPvpEnabled = TogglePvP.getPlugin().getPlayerManager().getPlayerPvPState(victim.getUniqueId()); if (!victimPvpEnabled) { event.setCancelled(true); } diff --git a/src/main/java/eu/endermite/togglepvp/players/PlayerManager.java b/src/main/java/eu/endermite/togglepvp/players/PlayerManager.java index 567d8b8..5c7786f 100644 --- a/src/main/java/eu/endermite/togglepvp/players/PlayerManager.java +++ b/src/main/java/eu/endermite/togglepvp/players/PlayerManager.java @@ -1,50 +1,65 @@ package eu.endermite.togglepvp.players; import eu.endermite.togglepvp.TogglePvP; +import lombok.Getter; import org.bukkit.Bukkit; import org.bukkit.entity.Player; +import java.time.Instant; import java.util.HashMap; +import java.util.UUID; public class PlayerManager { - HashMap> playerList = new HashMap<>(); + @Getter HashMap> playerList = new HashMap<>(); public PlayerManager() { + for (Player p : Bukkit.getOnlinePlayers()) { HashMap playerData; - playerData = TogglePvP.getPlugin().getSqLite().getPlayerInfo(p); - playerList.put(p, playerData); + playerData = TogglePvP.getPlugin().getSqLite().getPlayerInfo(p.getUniqueId()); + playerData.put("cachetime", refreshedCacheTime()); + playerList.put(p.getUniqueId(), playerData); } } - public HashMap getPlayer(Player p) { - return playerList.get(p); + + public long refreshedCacheTime() { + long cacheTime = TogglePvP.getPlugin().getConfigCache().getCache_time(); + return Instant.now().getEpochSecond()+cacheTime; } - public void addPlayer(Player player, HashMap data) { - playerList.put(player, data); + public void refreshPlayersCacheTime(UUID uuid) { + playerList.get(uuid).replace("cachetime", refreshedCacheTime()); } - public void removePlayer(Player player) { - playerList.remove(player); + public HashMap getPlayer(UUID uuid) { + return playerList.get(uuid); } - public boolean getPlayerPvPState(Player p) { - return (boolean) playerList.get(p).get("pvpenabled"); + public void addPlayer(UUID uuid, HashMap data) { + playerList.put(uuid, data); } - public void setPlayerPvpState(Player player, boolean state) { - playerList.get(player).replace("pvpenabled", state); + public void removePlayer(UUID uuid) { + playerList.remove(uuid); } - public boolean togglePlayerPvpState(Player player) { - boolean currentState = (boolean) playerList.get(player).get("pvpenabled"); + public boolean getPlayerPvPState(UUID uuid) { + return (boolean) playerList.get(uuid).get("pvpenabled"); + } + + public void setPlayerPvpState(UUID uuid, boolean state) { + playerList.get(uuid).replace("pvpenabled", state); + } + + public boolean togglePlayerPvpState(UUID uuid) { + boolean currentState = (boolean) playerList.get(uuid).get("pvpenabled"); if (currentState) { - playerList.get(player).replace("pvpenabled", false); + playerList.get(uuid).replace("pvpenabled", false); return false; } else { - playerList.get(player).replace("pvpenabled", true); + playerList.get(uuid).replace("pvpenabled", true); return true; } } diff --git a/src/main/java/eu/endermite/togglepvp/players/SmartCache.java b/src/main/java/eu/endermite/togglepvp/players/SmartCache.java new file mode 100644 index 0000000..131a793 --- /dev/null +++ b/src/main/java/eu/endermite/togglepvp/players/SmartCache.java @@ -0,0 +1,44 @@ +package eu.endermite.togglepvp.players; + +import eu.endermite.togglepvp.TogglePvP; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; + +import java.time.Instant; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.UUID; + +public class SmartCache { + + public static void runSmartCache() { + new BukkitRunnable() { + @Override + public void run() { + // Refresh cache timer if player is online + for (Map.Entry> e : TogglePvP.getPlugin().getPlayerManager().getPlayerList().entrySet()) { + try { + Player player = Bukkit.getPlayer(e.getKey()); + if (player.isOnline()) { + TogglePvP.getPlugin().getPlayerManager().refreshPlayersCacheTime(e.getKey()); + } + } catch (NullPointerException ignored) {} + } + + // Check for entries that should be invalidated + long now = Instant.now().getEpochSecond(); + Iterator>> it = TogglePvP.getPlugin().getPlayerManager().getPlayerList().entrySet().iterator(); + while(it.hasNext()) { + Map.Entry> cacheEntry = it.next(); + if ((Long) cacheEntry.getValue().get("cachetime") < now) { + TogglePvP.getPlugin().getPlayerManager().removePlayer(cacheEntry.getKey()); + } + } + } + }.runTaskTimerAsynchronously(TogglePvP.getPlugin(), 100, 100); + } + + +} diff --git a/src/main/java/eu/endermite/togglepvp/util/DatabaseSQLite.java b/src/main/java/eu/endermite/togglepvp/util/DatabaseSQLite.java index 4ac26bf..cf23134 100644 --- a/src/main/java/eu/endermite/togglepvp/util/DatabaseSQLite.java +++ b/src/main/java/eu/endermite/togglepvp/util/DatabaseSQLite.java @@ -1,13 +1,11 @@ package eu.endermite.togglepvp.util; import eu.endermite.togglepvp.TogglePvP; -import org.bukkit.entity.Player; import java.io.File; import java.sql.*; -import java.util.ArrayList; import java.util.HashMap; -import java.util.List; +import java.util.UUID; public class DatabaseSQLite { @@ -56,14 +54,14 @@ public class DatabaseSQLite { } } - public HashMap getPlayerInfo(Player p) { + public HashMap getPlayerInfo(UUID uuid) { HashMap dataHashMap = new HashMap<>(); try { Connection conn = DriverManager.getConnection(url); Statement insertnewuser = conn.createStatement(); try { - String newuserdata = "INSERT OR IGNORE INTO `players` (player_uuid, pvpenabled) VALUES ('" + p.getUniqueId().toString() + "', " + TogglePvP.getPlugin().getConfigCache().isPvp_enabled_by_default() + ")"; + String newuserdata = "INSERT OR IGNORE INTO `players` (player_uuid, pvpenabled) VALUES ('" + uuid.toString() + "', " + TogglePvP.getPlugin().getConfigCache().isPvp_enabled_by_default() + ")"; insertnewuser.execute(newuserdata); } catch (SQLException e) { if (e.getErrorCode() != 19) { @@ -71,7 +69,7 @@ public class DatabaseSQLite { } } Statement statement = conn.createStatement(); - String sql = "SELECT * FROM `players` WHERE `player_uuid` = '" + p.getUniqueId().toString() + "';"; + String sql = "SELECT * FROM `players` WHERE `player_uuid` = '" + uuid.toString() + "';"; statement.execute(sql); ResultSet result = statement.getResultSet(); dataHashMap.put("pvpenabled", result.getBoolean("pvpenabled")); @@ -84,13 +82,13 @@ public class DatabaseSQLite { return null; } - public void updatePlayerInfo(Player p, HashMap data) { + public void updatePlayerInfo(UUID uuid, HashMap data) { try { Connection conn = DriverManager.getConnection(url); Statement insertnewuser = conn.createStatement(); try { - String newuserdata = "UPDATE `players` SET pvpenabled = "+data.get("pvpenabled")+" WHERE `player_uuid` = '"+p.getUniqueId().toString()+"';"; + String newuserdata = "UPDATE `players` SET pvpenabled = "+data.get("pvpenabled")+" WHERE `player_uuid` = '"+uuid.toString()+"';"; insertnewuser.execute(newuserdata); } catch (SQLException e) { TogglePvP.getPlugin().getLogger().severe("Error while saving player data!"); diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 3e142bc..f2aa2d1 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -11,6 +11,11 @@ settings: # You may want to keep it disabled because players with pvp off can use it to attack players with pvp on channeling_enchant_disabled: false + # Time (in seconds) to keep player data in memory when players goes offline. + # This is used for checking if offline players pvp state. + # Adjust only if you know what you're doing. NEVER set to less than 6. + cache_time: 30 + messages: pvp_enabled: "&cYou enabled PvP!" pvp_disabled: "&cYou disabled PvP!"