From 3b56d57faf4d940c661741b40d65650d5ab98b01 Mon Sep 17 00:00:00 2001 From: YouHaveTrouble Date: Fri, 12 Mar 2021 04:07:36 +0100 Subject: [PATCH] fixed bugs with events --- .../togglepvp/config/ConfigCache.java | 11 +++++++- .../player/PlayerHitByProjectileListener.java | 25 ++++++++++++++++-- .../togglepvp/players/PlayerData.java | 4 +-- .../togglepvp/players/PlayerManager.java | 21 ++++++++------- .../endermite/togglepvp/util/CombatTimer.java | 26 ++++++++++++------- 5 files changed, 62 insertions(+), 25 deletions(-) diff --git a/src/main/java/eu/endermite/togglepvp/config/ConfigCache.java b/src/main/java/eu/endermite/togglepvp/config/ConfigCache.java index c8f3e0f..17c985a 100644 --- a/src/main/java/eu/endermite/togglepvp/config/ConfigCache.java +++ b/src/main/java/eu/endermite/togglepvp/config/ConfigCache.java @@ -10,7 +10,8 @@ public class ConfigCache { private final TogglePvp plugin = TogglePvp.getPlugin(); @Getter private final boolean pvp_enabled_by_default, lava_and_fire_stopper_enabled, channeling_enchant_disabled, - punish_for_combat_logout, punish_for_combat_logout_announce, only_owner_can_interact_with_pet; + punish_for_combat_logout, punish_for_combat_logout_announce, only_owner_can_interact_with_pet, + snowballs_knockback, egg_knockback; @Getter private final String pvp_enabled, pvp_disabled, cannot_attack_victim, cannot_attack_attacker, cannot_attack_pets_victim, cannot_attack_pets_attacker, no_permission, no_such_command, pvp_enabled_other, pvp_disabled_other, punish_for_combat_logout_message, entering_combat, leaving_combat, @@ -45,6 +46,10 @@ public class ConfigCache { addDefault("settings.punish_for_combat_logout.announce", "true"); addDefault("settings.punish_for_combat_logout.message", "&f%player% logged out while in combat. What a loser."); + addDefault("settings.snowballs_do_knockback", false, "Set to true if snowballs should cause knockback to players"); + + addDefault("settings.eggs_do_knockback", false, "Set to true if eggs should cause knockback to players"); + addDefault("settings.cache_time", "30", "Time (in seconds) to keep player data in memory when players goes offline.\nThis is used for checking if offline players pvp state.\nAdjust only if you know what you're doing. NEVER set to less than 6."); addDefault("messages.pvp_enabled", "&cYou enabled PvP!"); @@ -83,6 +88,10 @@ public class ConfigCache { this.punish_for_combat_logout_announce = config.getBoolean("settings.punish_for_combat_logout.announce", true); this.punish_for_combat_logout_message = config.getString("settings.punish_for_combat_logout.message", "&f%player% logged out while in combat. What a loser."); this.only_owner_can_interact_with_pet = config.getBoolean("settings.only_owner_can_interact_with_pet", false); + + this.snowballs_knockback = config.getBoolean("settings.snowballs_do_knockback", false); + this.egg_knockback = config.getBoolean("settings.eggs_do_knockback", false); + this.cache_time = config.getLong("settings.cache_time", 30L); this.login_protection_time = config.getLong("settings.login_protection_time", 0); 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 18d1203..a2d183e 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitByProjectileListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitByProjectileListener.java @@ -2,8 +2,7 @@ package eu.endermite.togglepvp.listeners.player; import eu.endermite.togglepvp.TogglePvp; import eu.endermite.togglepvp.util.CombatTimer; -import org.bukkit.entity.Player; -import org.bukkit.entity.Projectile; +import org.bukkit.entity.*; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; @@ -24,10 +23,32 @@ public class PlayerHitByProjectileListener implements Listener { UUID damager = ((Player) projectile.getShooter()).getUniqueId(); UUID victim = event.getEntity().getUniqueId(); + if (TogglePvp.getPlugin().getConfigCache().isSnowballs_knockback() && event.getDamager() instanceof Snowball) { + if (TogglePvp.getPlugin().getPlayerManager().canDamage(damager, victim, true)) { + ((Player) event.getEntity()).damage(0.01, (Entity) projectile.getShooter()); + CombatTimer.refreshPlayersCombatTime(damager, victim); + } else { + event.setCancelled(true); + return; + } + + } else if (TogglePvp.getPlugin().getConfigCache().isEgg_knockback() && event.getDamager() instanceof Egg) { + if (TogglePvp.getPlugin().getPlayerManager().canDamage(damager, victim, true)) { + ((Player) event.getEntity()).damage(0.01, (Entity) projectile.getShooter()); + CombatTimer.refreshPlayersCombatTime(damager, victim); + } else { + event.setCancelled(true); + return; + } + } + // Ender pearls and other self-damage if (damager == victim) return; + if (event.getDamage() == 0) + return; + if (TogglePvp.getPlugin().getPlayerManager().canDamage(damager, victim, true)) CombatTimer.refreshPlayersCombatTime(damager, victim); else diff --git a/src/main/java/eu/endermite/togglepvp/players/PlayerData.java b/src/main/java/eu/endermite/togglepvp/players/PlayerData.java index 5c4afe5..bf57a6f 100644 --- a/src/main/java/eu/endermite/togglepvp/players/PlayerData.java +++ b/src/main/java/eu/endermite/togglepvp/players/PlayerData.java @@ -55,7 +55,7 @@ public class PlayerData { } public void setLoginTimestamp(long loginTimestamp) { - this.loginTimestamp = loginTimestamp + TogglePvp.getPlugin().getConfigCache().getLogin_protection_time(); + this.loginTimestamp = loginTimestamp + TogglePvp.getPlugin().getConfigCache().getLogin_protection_time()-1; } public long getLoginTimestamp() { @@ -63,7 +63,7 @@ public class PlayerData { } public void setTeleportTimestamp(long teleportTimestamp) { - this.teleportTimestamp = teleportTimestamp + TogglePvp.getPlugin().getConfigCache().getTeleport_protection_time(); + this.teleportTimestamp = teleportTimestamp + TogglePvp.getPlugin().getConfigCache().getTeleport_protection_time()-1; } public long getTeleportTimestamp() { diff --git a/src/main/java/eu/endermite/togglepvp/players/PlayerManager.java b/src/main/java/eu/endermite/togglepvp/players/PlayerManager.java index 3f16e69..f30f301 100644 --- a/src/main/java/eu/endermite/togglepvp/players/PlayerManager.java +++ b/src/main/java/eu/endermite/togglepvp/players/PlayerManager.java @@ -34,16 +34,17 @@ public class PlayerManager { if (!CombatTimer.isInCombat(uuid)) { if (playerData.getLastCombatCheck()) { PlayerLeaveCombatEvent playerLeaveCombatEvent = new PlayerLeaveCombatEvent(Bukkit.getPlayer(uuid)); - Bukkit.getPluginManager().callEvent(playerLeaveCombatEvent); - - if (playerLeaveCombatEvent.isCancelled()) { - playerData.refreshCombatTime(); - return; - } else { - playerData.setLastCombatCheck(false); - playerData.setInCombat(false); - PluginMessages.sendActionBar(uuid, TogglePvp.getPlugin().getConfigCache().getLeaving_combat()); - } + Bukkit.getScheduler().runTask(TogglePvp.getPlugin(), () -> { + Bukkit.getPluginManager().callEvent(playerLeaveCombatEvent); + if (playerLeaveCombatEvent.isCancelled()) { + playerData.setLastCombatCheck(true); + playerData.refreshCombatTime(); + } else { + playerData.setLastCombatCheck(false); + playerData.setInCombat(false); + PluginMessages.sendActionBar(uuid, TogglePvp.getPlugin().getConfigCache().getLeaving_combat()); + } + }); } } else { set.getValue().setLastCombatCheck(true); diff --git a/src/main/java/eu/endermite/togglepvp/util/CombatTimer.java b/src/main/java/eu/endermite/togglepvp/util/CombatTimer.java index 3b08b0c..e59f0e9 100644 --- a/src/main/java/eu/endermite/togglepvp/util/CombatTimer.java +++ b/src/main/java/eu/endermite/togglepvp/util/CombatTimer.java @@ -14,16 +14,22 @@ public class CombatTimer { try { long now = Instant.now().getEpochSecond(); long combattime = TogglePvp.getPlugin().getSmartCache().getPlayerData(uuid).getCombattime(); - if (combattime < now) { - Player player = Bukkit.getPlayer(uuid); - PlayerEnterCombatEvent playerEnterCombatEvent = new PlayerEnterCombatEvent(player); - Bukkit.getPluginManager().callEvent(playerEnterCombatEvent); - if (playerEnterCombatEvent.isCancelled()) - return; - TogglePvp.getPlugin().getPlayerManager().refreshPlayersCombatTime(uuid); - PluginMessages.sendActionBar(uuid, TogglePvp.getPlugin().getConfigCache().getEntering_combat()); - } + Player player = Bukkit.getPlayer(uuid); + Bukkit.getScheduler().runTask(TogglePvp.getPlugin(), () -> { + PlayerEnterCombatEvent playerEnterCombatEvent = new PlayerEnterCombatEvent(player); + Bukkit.getPluginManager().callEvent(playerEnterCombatEvent); + if (playerEnterCombatEvent.isCancelled()) + return; + TogglePvp.getPlugin().getPlayerManager().refreshPlayersCombatTime(uuid); + + if (combattime <= now) { + PluginMessages.sendActionBar(uuid, TogglePvp.getPlugin().getConfigCache().getEntering_combat()); + } + }); + + + } catch (Exception ignored) {} } @@ -34,7 +40,7 @@ public class CombatTimer { public static boolean isInCombat(UUID uuid) { try { - return TogglePvp.getPlugin().getPlayerManager().getPlayer(uuid).isInCombat(); + return TogglePvp.getPlugin().getPlayerManager().getPlayer(uuid).getCombattime() >= Instant.now().getEpochSecond(); } catch (Exception e) { return false; }