From 7655b2804eb935474ab2a16ceeb7f36cdb8199ca Mon Sep 17 00:00:00 2001 From: YouHaveTrouble Date: Thu, 25 Feb 2021 02:50:18 +0100 Subject: [PATCH] login protection option and some upgrades --- .../togglepvp/config/ConfigCache.java | 3 ++ .../player/PetAttackPlayerListener.java | 14 ++++++- .../player/PlayerAttackListener.java | 15 +++++-- .../player/PlayerHitByExplosionListener.java | 14 ++++++- .../player/PlayerHitByFireworkListener.java | 17 ++++++-- .../player/PlayerHitByProjectileListener.java | 17 ++++++-- .../PlayerHitBySplashPotionListener.java | 42 +++++++++++++------ .../player/PlayerJoinAndLeaveListener.java | 4 +- .../togglepvp/players/PlayerData.java | 12 +++++- .../togglepvp/players/SmartCache.java | 4 +- .../togglepvp/util/DatabaseSQLite.java | 2 +- src/main/resources/config.yml | 3 ++ 12 files changed, 113 insertions(+), 34 deletions(-) diff --git a/src/main/java/eu/endermite/togglepvp/config/ConfigCache.java b/src/main/java/eu/endermite/togglepvp/config/ConfigCache.java index fe57741..d7fa83a 100644 --- a/src/main/java/eu/endermite/togglepvp/config/ConfigCache.java +++ b/src/main/java/eu/endermite/togglepvp/config/ConfigCache.java @@ -29,6 +29,7 @@ public class ConfigCache { @Getter private final String leaving_combat; @Getter final String cant_do_that_during_combat; @Getter final boolean only_owner_can_interact_with_pet; + @Getter final long login_protection_time; public ConfigCache() { @@ -49,6 +50,8 @@ public class ConfigCache { this.only_owner_can_interact_with_pet = config.getBoolean("settings.only_owner_can_interact_with_pet", false); this.cache_time = config.getLong("settings.cache_time", 30L); + this.login_protection_time = config.getLong("settings.login_protection_time", 0); + // Messages this.pvp_enabled = config.getString("messages.pvp_enabled", "&cYou enabled PvP!"); this.pvp_disabled = config.getString("messages.pvp_disabled", "&cYou disabled PvP!"); diff --git a/src/main/java/eu/endermite/togglepvp/listeners/player/PetAttackPlayerListener.java b/src/main/java/eu/endermite/togglepvp/listeners/player/PetAttackPlayerListener.java index a2ddeae..0defcc1 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/player/PetAttackPlayerListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/player/PetAttackPlayerListener.java @@ -1,6 +1,7 @@ package eu.endermite.togglepvp.listeners.player; import eu.endermite.togglepvp.TogglePvp; +import eu.endermite.togglepvp.players.SmartCache; import eu.endermite.togglepvp.util.CombatTimer; import org.bukkit.entity.Player; import org.bukkit.entity.Tameable; @@ -9,6 +10,8 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; +import java.time.Instant; + @eu.endermite.togglepvp.util.Listener public class PetAttackPlayerListener implements Listener { @@ -18,15 +21,22 @@ public class PetAttackPlayerListener implements Listener { */ @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void onWolfAttack(org.bukkit.event.entity.EntityDamageByEntityEvent event) { + if (!(event.getDamager() instanceof Tameable)) return; Tameable entity = (Tameable) event.getDamager(); if (entity.getOwner() != null && event.getEntity() instanceof Player) { - boolean damagerPvpEnabled = TogglePvp.getPlugin().getSmartCache().getPlayerData(entity.getOwner().getUniqueId()).isPvpEnabled(); Player victim = (Player) event.getEntity(); - boolean victimPvpEnabled = TogglePvp.getPlugin().getPlayerManager().getPlayerPvPState(victim.getUniqueId()); + SmartCache smartCache = TogglePvp.getPlugin().getSmartCache(); + + if (Instant.now().getEpochSecond() < smartCache.getPlayerData(victim.getUniqueId()).getLoginTimestamp()) { + event.setCancelled(true); + return; + } + boolean damagerPvpEnabled = smartCache.getPlayerData(entity.getOwner().getUniqueId()).isPvpEnabled(); + boolean victimPvpEnabled = smartCache.getPlayerData(victim.getUniqueId()).isPvpEnabled(); if (!victimPvpEnabled || !damagerPvpEnabled) { if (entity instanceof Wolf) { Wolf wolf = (Wolf) entity; 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 865857e..9089c80 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerAttackListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerAttackListener.java @@ -2,6 +2,7 @@ package eu.endermite.togglepvp.listeners.player; import eu.endermite.togglepvp.TogglePvp; import eu.endermite.togglepvp.config.ConfigCache; +import eu.endermite.togglepvp.players.SmartCache; import eu.endermite.togglepvp.util.CombatTimer; import eu.endermite.togglepvp.util.PluginMessages; import org.bukkit.entity.Entity; @@ -10,6 +11,8 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; +import java.time.Instant; + @eu.endermite.togglepvp.util.Listener public class PlayerAttackListener implements Listener { @@ -27,15 +30,19 @@ public class PlayerAttackListener implements Listener { ConfigCache config = TogglePvp.getPlugin().getConfigCache(); - boolean damagerPvpEnabled = TogglePvp.getPlugin().getPlayerManager().getPlayerPvPState(damager.getUniqueId()); - boolean victimPvpEnabled = TogglePvp.getPlugin().getPlayerManager().getPlayerPvPState(victim.getUniqueId()); + SmartCache smartCache = TogglePvp.getPlugin().getSmartCache(); - if (!damagerPvpEnabled) { + if (Instant.now().getEpochSecond() < smartCache.getPlayerData(victim.getUniqueId()).getLoginTimestamp()) { + event.setCancelled(true); + return; + } + + if (!smartCache.getPlayerData(damager.getUniqueId()).isPvpEnabled()) { event.setCancelled(true); PluginMessages.sendActionBar(damager, config.getCannot_attack_attacker()); return; } - if (!victimPvpEnabled) { + if (!smartCache.getPlayerData(victim.getUniqueId()).isPvpEnabled()) { event.setCancelled(true); PluginMessages.sendActionBar(damager, config.getCannot_attack_victim()); return; 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 c1e5999..5c86252 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitByExplosionListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitByExplosionListener.java @@ -2,6 +2,7 @@ package eu.endermite.togglepvp.listeners.player; import eu.endermite.togglepvp.TogglePvp; import eu.endermite.togglepvp.config.ConfigCache; +import eu.endermite.togglepvp.players.SmartCache; import eu.endermite.togglepvp.util.CombatTimer; import eu.endermite.togglepvp.util.PluginMessages; import org.bukkit.entity.EnderCrystal; @@ -15,6 +16,8 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.metadata.FixedMetadataValue; + +import java.time.Instant; import java.util.UUID; @eu.endermite.togglepvp.util.Listener @@ -35,13 +38,20 @@ public class PlayerHitByExplosionListener implements Listener { if (victim.getUniqueId().equals(damageruuid)) return; + SmartCache smartCache = TogglePvp.getPlugin().getSmartCache(); + + if (Instant.now().getEpochSecond() < smartCache.getPlayerData(victim.getUniqueId()).getLoginTimestamp()) { + event.setCancelled(true); + return; + } + ConfigCache config = TogglePvp.getPlugin().getConfigCache(); - if (!TogglePvp.getPlugin().getSmartCache().getPlayerData(damageruuid).isPvpEnabled()) { + if (!smartCache.getPlayerData(damageruuid).isPvpEnabled()) { PluginMessages.sendActionBar(damageruuid, config.getCannot_attack_attacker()); event.setCancelled(true); return; } - if (!TogglePvp.getPlugin().getPlayerManager().getPlayerPvPState(victim.getUniqueId())) { + if (!smartCache.getPlayerData(victim.getUniqueId()).isPvpEnabled()) { PluginMessages.sendActionBar(damageruuid, config.getCannot_attack_victim()); event.setCancelled(true); return; 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 c5ffad4..826de50 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitByFireworkListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitByFireworkListener.java @@ -1,6 +1,7 @@ package eu.endermite.togglepvp.listeners.player; import eu.endermite.togglepvp.TogglePvp; +import eu.endermite.togglepvp.players.SmartCache; import eu.endermite.togglepvp.util.CombatTimer; import eu.endermite.togglepvp.util.PluginMessages; import org.bukkit.entity.Firework; @@ -9,6 +10,8 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; +import java.time.Instant; + @eu.endermite.togglepvp.util.Listener public class PlayerHitByFireworkListener implements Listener { @@ -22,14 +25,20 @@ public class PlayerHitByFireworkListener implements Listener { if (damager == victim) { return; } - boolean damagerPvpEnabled = TogglePvp.getPlugin().getPlayerManager().getPlayerPvPState(victim.getUniqueId()); - if (!damagerPvpEnabled) { + + SmartCache smartCache = TogglePvp.getPlugin().getSmartCache(); + + if (Instant.now().getEpochSecond() < smartCache.getPlayerData(victim.getUniqueId()).getLoginTimestamp()) { + event.setCancelled(true); + return; + } + + if (!smartCache.getPlayerData(damager.getUniqueId()).isPvpEnabled()) { event.setCancelled(true); PluginMessages.sendActionBar(damager.getUniqueId(), TogglePvp.getPlugin().getConfigCache().getCannot_attack_attacker()); return; } - boolean victimPvpEnabled = TogglePvp.getPlugin().getPlayerManager().getPlayerPvPState(victim.getUniqueId()); - if (!victimPvpEnabled) { + if (!smartCache.getPlayerData(victim.getUniqueId()).isPvpEnabled()) { event.setCancelled(true); PluginMessages.sendActionBar(damager.getUniqueId(), TogglePvp.getPlugin().getConfigCache().getCannot_attack_victim()); return; 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 380899e..03fca78 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitByProjectileListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitByProjectileListener.java @@ -2,6 +2,7 @@ package eu.endermite.togglepvp.listeners.player; import eu.endermite.togglepvp.TogglePvp; import eu.endermite.togglepvp.config.ConfigCache; +import eu.endermite.togglepvp.players.SmartCache; import eu.endermite.togglepvp.util.CombatTimer; import eu.endermite.togglepvp.util.PluginMessages; import org.bukkit.entity.Player; @@ -10,6 +11,8 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; +import java.time.Instant; + @eu.endermite.togglepvp.util.Listener public class PlayerHitByProjectileListener implements Listener { @@ -30,14 +33,20 @@ public class PlayerHitByProjectileListener implements Listener { return; } ConfigCache config = TogglePvp.getPlugin().getConfigCache(); - boolean damagerPvpEnabled = TogglePvp.getPlugin().getPlayerManager().getPlayerPvPState(damager.getUniqueId()); - boolean victimPvpEnabled = TogglePvp.getPlugin().getPlayerManager().getPlayerPvPState(victim.getUniqueId()); - if (!damagerPvpEnabled) { + + SmartCache smartCache = TogglePvp.getPlugin().getSmartCache(); + + if (Instant.now().getEpochSecond() < smartCache.getPlayerData(victim.getUniqueId()).getLoginTimestamp()) { + event.setCancelled(true); + return; + } + + if (!smartCache.getPlayerData(damager.getUniqueId()).isPvpEnabled()) { event.setCancelled(true); PluginMessages.sendActionBar(damager, config.getCannot_attack_attacker()); return; } - if (!victimPvpEnabled) { + if (!smartCache.getPlayerData(victim.getUniqueId()).isPvpEnabled()) { event.setCancelled(true); PluginMessages.sendActionBar(damager, config.getCannot_attack_victim()); return; 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 4fc098b..a87db18 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitBySplashPotionListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitBySplashPotionListener.java @@ -2,6 +2,7 @@ package eu.endermite.togglepvp.listeners.player; import eu.endermite.togglepvp.TogglePvp; import eu.endermite.togglepvp.config.ConfigCache; +import eu.endermite.togglepvp.players.SmartCache; import eu.endermite.togglepvp.util.CombatTimer; import eu.endermite.togglepvp.util.PluginMessages; import org.bukkit.entity.Entity; @@ -11,10 +12,27 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; +import java.time.Instant; +import java.util.ArrayList; +import java.util.List; @eu.endermite.togglepvp.util.Listener public class PlayerHitBySplashPotionListener implements Listener { + private final List harmfulPotions = new ArrayList<>(); + + public PlayerHitBySplashPotionListener() { + harmfulPotions.add(PotionEffectType.BLINDNESS); + harmfulPotions.add(PotionEffectType.CONFUSION); + harmfulPotions.add(PotionEffectType.HARM); + harmfulPotions.add(PotionEffectType.HUNGER); + harmfulPotions.add(PotionEffectType.POISON); + harmfulPotions.add(PotionEffectType.SLOW_DIGGING); + harmfulPotions.add(PotionEffectType.WEAKNESS); + harmfulPotions.add(PotionEffectType.SLOW); + harmfulPotions.add(PotionEffectType.WITHER); + } + /** * If thrown potion is applies negative effects and it's thrown by a player it will ahve no effect on player with pvp off */ @@ -27,16 +45,9 @@ public class PlayerHitBySplashPotionListener implements Listener { boolean harmful = false; for (PotionEffect effect : event.getPotion().getEffects()) { - if (effect.getType().equals(PotionEffectType.BLINDNESS) || - effect.getType().equals(PotionEffectType.CONFUSION) || - effect.getType().equals(PotionEffectType.HARM) || - effect.getType().equals(PotionEffectType.HUNGER) || - effect.getType().equals(PotionEffectType.POISON) || - effect.getType().equals(PotionEffectType.SLOW_DIGGING) || - effect.getType().equals(PotionEffectType.WEAKNESS) || - effect.getType().equals(PotionEffectType.SLOW) || - effect.getType().equals(PotionEffectType.WITHER)) { + if (harmfulPotions.contains(effect.getType())) { harmful = true; + break; } } if (!harmful) @@ -48,15 +59,20 @@ public class PlayerHitBySplashPotionListener implements Listener { if (damager == victim) continue; + SmartCache smartCache = TogglePvp.getPlugin().getSmartCache(); + + if (Instant.now().getEpochSecond() < smartCache.getPlayerData(victim.getUniqueId()).getLoginTimestamp()) { + event.setIntensity(victim, 0); + continue; + } + ConfigCache config = TogglePvp.getPlugin().getConfigCache(); - boolean damagerPvpEnabled = TogglePvp.getPlugin().getPlayerManager().getPlayerPvPState(damager.getUniqueId()); - if (!damagerPvpEnabled) { + if (!smartCache.getPlayerData(damager.getUniqueId()).isPvpEnabled()) { event.setIntensity(victim, 0); PluginMessages.sendActionBar(damager, config.getCannot_attack_attacker()); continue; } - boolean victimPvpEnabled = TogglePvp.getPlugin().getPlayerManager().getPlayerPvPState(victim.getUniqueId()); - if (!victimPvpEnabled) { + if (!smartCache.getPlayerData(victim.getUniqueId()).isPvpEnabled()) { event.setIntensity(victim, 0); PluginMessages.sendActionBar(damager, config.getCannot_attack_victim()); continue; 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 915f520..de7f10d 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerJoinAndLeaveListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerJoinAndLeaveListener.java @@ -37,7 +37,9 @@ public class PlayerJoinAndLeaveListener implements Listener { if (TogglePvp.getPlugin().getConfigCache().isPunish_for_combat_logout_announce()) { PluginMessages.broadcastMessage(player, TogglePvp.getPlugin().getConfigCache().getPunish_for_combat_logout_message()); } - TogglePvp.getPlugin().getPlayerManager().getPlayer(player.getUniqueId()).setCombattime(now-1); + PlayerData playerData = TogglePvp.getPlugin().getPlayerManager().getPlayer(player.getUniqueId()); + playerData.setCombattime(now-1); + playerData.setLoginTimestamp(Instant.now().getEpochSecond()); } } } diff --git a/src/main/java/eu/endermite/togglepvp/players/PlayerData.java b/src/main/java/eu/endermite/togglepvp/players/PlayerData.java index bef2727..00d41a5 100644 --- a/src/main/java/eu/endermite/togglepvp/players/PlayerData.java +++ b/src/main/java/eu/endermite/togglepvp/players/PlayerData.java @@ -9,10 +9,12 @@ public class PlayerData { private long cachetime, combattime; private boolean pvpEnabled; private boolean lastCombatCheck; + private long loginTimestamp; - public PlayerData(boolean pvpEnabled) { + public PlayerData(boolean pvpEnabled, long loginTimestamp) { this.pvpEnabled = pvpEnabled; this.combattime = Instant.now().getEpochSecond()-1; + this.loginTimestamp = loginTimestamp; refreshCachetime(); } @@ -52,4 +54,12 @@ public class PlayerData { public void setLastCombatCheck(boolean bool) { lastCombatCheck = bool; } + + public void setLoginTimestamp(long loginTimestamp) { + this.loginTimestamp = loginTimestamp + TogglePvp.getPlugin().getConfigCache().getLogin_protection_time(); + } + + public long getLoginTimestamp() { + return loginTimestamp; + } } diff --git a/src/main/java/eu/endermite/togglepvp/players/SmartCache.java b/src/main/java/eu/endermite/togglepvp/players/SmartCache.java index ad9e7aa..3ae4e6d 100644 --- a/src/main/java/eu/endermite/togglepvp/players/SmartCache.java +++ b/src/main/java/eu/endermite/togglepvp/players/SmartCache.java @@ -42,7 +42,7 @@ public class SmartCache { return playerData; } catch (NullPointerException ex) { // Return false if database call fails - return new PlayerData(false); + return new PlayerData(false, 0); } } } @@ -53,7 +53,7 @@ public class SmartCache { TogglePvp.getPlugin().getPlayerManager().getPlayer(uuid).setPvpEnabled(state); } // Update the database aswell - TogglePvp.getPlugin().getSqLite().updatePlayerInfo(uuid, new PlayerData(state)); + TogglePvp.getPlugin().getSqLite().updatePlayerInfo(uuid, new PlayerData(state, 0)); } diff --git a/src/main/java/eu/endermite/togglepvp/util/DatabaseSQLite.java b/src/main/java/eu/endermite/togglepvp/util/DatabaseSQLite.java index 87e0c14..0ed50ea 100644 --- a/src/main/java/eu/endermite/togglepvp/util/DatabaseSQLite.java +++ b/src/main/java/eu/endermite/togglepvp/util/DatabaseSQLite.java @@ -70,7 +70,7 @@ public class DatabaseSQLite { ResultSet result = statement.getResultSet(); boolean state = result.getBoolean("pvpenabled"); conn.close(); - return new PlayerData(state); + return new PlayerData(state, 0); } catch (SQLException throwables) { throwables.printStackTrace(); } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 588d6cd..588f659 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -18,6 +18,9 @@ settings: # Time (in seconds) to keep player in combat combat_time: 25 + # Time (in seconds) that player can't be harmed by other player after logging in + login_protection_time: 0 + # Kill the player if they log out during combat punish_for_combat_logout: enabled: true