From aab96c7a217267c699eb30a2dee3b71abbb190e2 Mon Sep 17 00:00:00 2001 From: YouHaveTrouble Date: Fri, 21 Aug 2020 15:10:31 +0200 Subject: [PATCH] added combat tracker --- .../eu/endermite/togglepvp/TogglePvP.java | 2 +- .../togglepvp/config/ConfigCache.java | 16 ++++++++++- .../player/PlayerAttackListener.java | 3 +++ .../player/PlayerHitByExplosionListener.java | 2 ++ .../player/PlayerHitByFireworkListener.java | 3 +++ .../player/PlayerHitByProjectileListener.java | 6 ++--- .../PlayerHitBySplashPotionListener.java | 3 +++ .../player/PlayerJoinAndLeaveListener.java | 18 ++++++++++--- .../player/WolfAttackPlayerListener.java | 7 ++--- .../AreaEffectCloudApplyListener.java | 6 ++++- .../EntityHitByLightningListener.java | 3 --- .../listeners/unspecific/FishingListener.java | 6 ++++- .../unspecific/LavaDumpAndIgniteListener.java | 5 ++++ .../unspecific/PlaceWitherRoseListener.java | 6 ++--- .../wolf/PlayerAttackWolfListener.java | 8 +++--- .../wolf/PlayerHitWolfWithProjectile.java | 3 +++ .../wolf/WolfHitByExplosionListener.java | 7 ++--- .../wolf/WolfHitByFireworkListener.java | 3 +++ .../wolf/WolfHitBySplashPotionListener.java | 3 +++ .../togglepvp/players/PlayerManager.java | 11 ++++++++ .../togglepvp/players/SmartCache.java | 1 + .../endermite/togglepvp/util/CombatTimer.java | 27 +++++++++++++++++++ .../togglepvp/util/PluginMessages.java | 7 +++++ src/main/resources/config.yml | 11 ++++++++ 24 files changed, 140 insertions(+), 27 deletions(-) create mode 100644 src/main/java/eu/endermite/togglepvp/util/CombatTimer.java diff --git a/src/main/java/eu/endermite/togglepvp/TogglePvP.java b/src/main/java/eu/endermite/togglepvp/TogglePvP.java index ba2f525..9de2faf 100644 --- a/src/main/java/eu/endermite/togglepvp/TogglePvP.java +++ b/src/main/java/eu/endermite/togglepvp/TogglePvP.java @@ -37,7 +37,7 @@ public final class TogglePvP extends JavaPlugin { sqLite = new DatabaseSQLite("jdbc:sqlite:plugins/TogglePvP/TogglePvP.db", dbFile); sqLite.createDatabaseFile(); if (!sqLite.testConnection()) { - getLogger().severe("Error with accessing database."); + getLogger().severe("Error with accessing database. Check if server has write rights."); getLogger().severe("Plugin will now disable."); getServer().getPluginManager().disablePlugin(this); } diff --git a/src/main/java/eu/endermite/togglepvp/config/ConfigCache.java b/src/main/java/eu/endermite/togglepvp/config/ConfigCache.java index e62e648..0248b04 100644 --- a/src/main/java/eu/endermite/togglepvp/config/ConfigCache.java +++ b/src/main/java/eu/endermite/togglepvp/config/ConfigCache.java @@ -21,6 +21,12 @@ public class ConfigCache { @Getter private final double lava_and_fire_stopper_radius; @Getter private final boolean channeling_enchant_disabled; @Getter private final long cache_time; + @Getter private final long combat_time; + @Getter private final boolean punish_for_combat_logout; + @Getter private final boolean punish_for_combat_logout_announce; + @Getter private final String punish_for_combat_logout_message; + @Getter private final String entering_combat; + @Getter private final String leaving_combat; public ConfigCache() { @@ -34,6 +40,11 @@ public class ConfigCache { this.channeling_enchant_disabled = config.getBoolean("settings.channeling_enchant_disabled", true); + this.combat_time = config.getLong("settings.combat_time", 25L); + this.punish_for_combat_logout = config.getBoolean("settings.punish_for_combat_logout.enabled", true); + 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.cache_time = config.getLong("settings.cache_time", 30L); // Messages @@ -46,6 +57,9 @@ public class ConfigCache { this.no_permission = config.getString("messages.no_permission", "&cYou don't have permission to use that."); this.no_such_command = config.getString("messages.no_such_command", "&cNo such command."); this.pvp_enabled_other = config.getString("messages.pvp_enabled_others", "&cYou've enabled %player%'s PvP."); - this.pvp_disabled_other =config.getString("messages.pvp_disabled_others", "&cYou've disabled %player%'s PvP."); + this.pvp_disabled_other = config.getString("messages.pvp_disabled_others", "&cYou've disabled %player%'s PvP."); + this.entering_combat = config.getString("messages.entering_combat", "&cEntering combat"); + this.leaving_combat = config.getString("messages.leaving_combat", "&cLeaving combat"); + } } 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 7709e38..e0d58de 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.util.CombatTimer; import eu.endermite.togglepvp.util.PluginMessages; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; @@ -37,7 +38,9 @@ public class PlayerAttackListener implements Listener { if (!victimPvpEnabled) { event.setCancelled(true); PluginMessages.sendActionBar(damager, config.getCannot_attack_victim()); + return; } + CombatTimer.refreshPlayersCombatTime(damager.getUniqueId(), victim.getUniqueId()); } } 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 4a0d116..8b57832 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitByExplosionListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerHitByExplosionListener.java @@ -3,6 +3,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.*; import org.bukkit.entity.minecart.ExplosiveMinecart; @@ -42,6 +43,7 @@ public class PlayerHitByExplosionListener implements Listener { event.setCancelled(true); return; } + CombatTimer.refreshPlayersCombatTime(damageruuid, victim.getUniqueId()); } } catch (NullPointerException | IndexOutOfBoundsException ignored) {} } 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 ed5283a..96d54c6 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.util.CombatTimer; import eu.endermite.togglepvp.util.PluginMessages; import org.bukkit.entity.Firework; import org.bukkit.entity.Player; @@ -31,7 +32,9 @@ public class PlayerHitByFireworkListener implements Listener { if (!victimPvpEnabled) { event.setCancelled(true); PluginMessages.sendActionBar(damager.getUniqueId(), TogglePvP.getPlugin().getConfigCache().getCannot_attack_victim()); + return; } + CombatTimer.refreshPlayersCombatTime(damager.getUniqueId(), victim.getUniqueId()); } } } 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 cd7487b..a65b5d4 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.util.CombatTimer; import eu.endermite.togglepvp.util.PluginMessages; import org.bukkit.entity.Player; import org.bukkit.entity.Projectile; @@ -28,12 +29,9 @@ public class PlayerHitByProjectileListener implements Listener { if (damager == victim) { return; } - ConfigCache config = TogglePvP.getPlugin().getConfigCache(); - 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()); @@ -42,7 +40,9 @@ public class PlayerHitByProjectileListener implements Listener { if (!victimPvpEnabled) { event.setCancelled(true); PluginMessages.sendActionBar(damager, config.getCannot_attack_victim()); + return; } + CombatTimer.refreshPlayersCombatTime(damager.getUniqueId(), victim.getUniqueId()); } } } 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 f4797e2..f426df0 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.util.CombatTimer; import eu.endermite.togglepvp.util.PluginMessages; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; @@ -58,7 +59,9 @@ public class PlayerHitBySplashPotionListener implements Listener { if (!victimPvpEnabled) { event.setIntensity(victim, 0); PluginMessages.sendActionBar(damager, config.getCannot_attack_victim()); + continue; } + CombatTimer.refreshPlayersCombatTime(damager.getUniqueId(), victim.getUniqueId()); } } } 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 78f114f..6ee3f25 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerJoinAndLeaveListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/player/PlayerJoinAndLeaveListener.java @@ -1,33 +1,45 @@ package eu.endermite.togglepvp.listeners.player; import eu.endermite.togglepvp.TogglePvP; +import eu.endermite.togglepvp.util.PluginMessages; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; +import java.time.Instant; import java.util.HashMap; @eu.endermite.togglepvp.util.Listener public class PlayerJoinAndLeaveListener implements Listener { - /** * This event is here to get players saved options on join */ @EventHandler(ignoreCancelled = true) public void onPlayerJoin(org.bukkit.event.player.PlayerJoinEvent event) { - Player player = event.getPlayer(); HashMap playerData; playerData = TogglePvP.getPlugin().getSqLite().getPlayerInfo(player.getUniqueId()); playerData.put("cachetime", TogglePvP.getPlugin().getPlayerManager().refreshedCacheTime()); + playerData.put("combattime", Instant.now().getEpochSecond()-1); TogglePvP.getPlugin().getPlayerManager().addPlayer(player.getUniqueId(), playerData); } /** * This event is here to dump player's saved options from memory + * Also punishes players who log out during combat */ @EventHandler public void onPlayerLeave(org.bukkit.event.player.PlayerQuitEvent event) { Player player = event.getPlayer(); TogglePvP.getPlugin().getSqLite().updatePlayerInfo(player.getUniqueId(), TogglePvP.getPlugin().getPlayerManager().getPlayer(player.getUniqueId())); + if (TogglePvP.getPlugin().getConfigCache().isPunish_for_combat_logout()) { + long now = Instant.now().getEpochSecond(); + long combatTime = (long) TogglePvP.getPlugin().getPlayerManager().getPlayer(player.getUniqueId()).get("combattime"); + if (combatTime > now) { + player.setHealth(0); + 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()).replace("combattime", now-1); + } + } } - } diff --git a/src/main/java/eu/endermite/togglepvp/listeners/player/WolfAttackPlayerListener.java b/src/main/java/eu/endermite/togglepvp/listeners/player/WolfAttackPlayerListener.java index c89246a..99b6961 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/player/WolfAttackPlayerListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/player/WolfAttackPlayerListener.java @@ -2,6 +2,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.Wolf; import org.bukkit.event.EventHandler; @@ -27,10 +28,10 @@ public class WolfAttackPlayerListener implements Listener { if (!victimPvpEnabled || !damagerPvpEnabled) { wolf.setAngry(false); event.setCancelled(true); + return; } - } catch (NullPointerException e) { - return; - } + CombatTimer.refreshPlayersCombatTime(wolf.getOwner().getUniqueId(), victim.getUniqueId()); + } catch (NullPointerException ignored) {} } } } diff --git a/src/main/java/eu/endermite/togglepvp/listeners/unspecific/AreaEffectCloudApplyListener.java b/src/main/java/eu/endermite/togglepvp/listeners/unspecific/AreaEffectCloudApplyListener.java index d2d97d1..993f0ee 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/unspecific/AreaEffectCloudApplyListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/unspecific/AreaEffectCloudApplyListener.java @@ -3,6 +3,7 @@ package eu.endermite.togglepvp.listeners.unspecific; 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.LivingEntity; import org.bukkit.entity.Player; @@ -56,7 +57,9 @@ public class AreaEffectCloudApplyListener implements Listener { if (!victimPvpEnabled) { it.remove(); PluginMessages.sendActionBar(damager, config.getCannot_attack_victim()); + continue; } + CombatTimer.refreshPlayersCombatTime(damager.getUniqueId(), victim.getUniqueId()); } else if (entity instanceof Wolf) { Wolf victim = (Wolf) entity; if (victim.getOwner() == null) { @@ -73,11 +76,12 @@ public class AreaEffectCloudApplyListener implements Listener { if (!victimPvpEnabled) { it.remove(); PluginMessages.sendActionBar(damager, config.getCannot_attack_pets_victim()); + continue; } + CombatTimer.refreshPlayersCombatTime(damager.getUniqueId(), victim.getOwner().getUniqueId()); } } } } } - } diff --git a/src/main/java/eu/endermite/togglepvp/listeners/unspecific/EntityHitByLightningListener.java b/src/main/java/eu/endermite/togglepvp/listeners/unspecific/EntityHitByLightningListener.java index e13d375..711b9b6 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/unspecific/EntityHitByLightningListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/unspecific/EntityHitByLightningListener.java @@ -46,14 +46,11 @@ public class EntityHitByLightningListener implements Listener { @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void onLightningStrike(LightningStrikeEvent event){ if(event.getCause() == LightningStrikeEvent.Cause.TRIDENT){ - if (TogglePvP.getPlugin().getConfigCache().isChanneling_enchant_disabled()) { event.setCancelled(true); return; } - event.getLightning().setMetadata("TRIDENT", new FixedMetadataValue(TogglePvP.getPlugin(), event.getLightning().getLocation())); } } - } diff --git a/src/main/java/eu/endermite/togglepvp/listeners/unspecific/FishingListener.java b/src/main/java/eu/endermite/togglepvp/listeners/unspecific/FishingListener.java index a724a07..27c7333 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/unspecific/FishingListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/unspecific/FishingListener.java @@ -3,6 +3,7 @@ package eu.endermite.togglepvp.listeners.unspecific; 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; import org.bukkit.entity.Wolf; @@ -36,7 +37,9 @@ public class FishingListener implements Listener { if (!victimPvpEnabled) { event.setCancelled(true); PluginMessages.sendActionBar(damager, config.getCannot_attack_victim()); + return; } + CombatTimer.refreshPlayersCombatTime(damager.getUniqueId(), victim.getUniqueId()); } else if (event.getCaught() instanceof Wolf) { Wolf victim = (Wolf) event.getCaught(); if (victim.getOwner() == null) { @@ -53,8 +56,9 @@ public class FishingListener implements Listener { if (!victimPvpEnabled) { event.setCancelled(true); PluginMessages.sendActionBar(damager, config.getCannot_attack_victim()); + return; } + CombatTimer.refreshPlayersCombatTime(damager.getUniqueId(), victim.getOwner().getUniqueId()); } } - } diff --git a/src/main/java/eu/endermite/togglepvp/listeners/unspecific/LavaDumpAndIgniteListener.java b/src/main/java/eu/endermite/togglepvp/listeners/unspecific/LavaDumpAndIgniteListener.java index 5a03ede..c177980 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/unspecific/LavaDumpAndIgniteListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/unspecific/LavaDumpAndIgniteListener.java @@ -4,6 +4,7 @@ import eu.endermite.togglepvp.TogglePvP; import eu.endermite.togglepvp.config.ConfigCache; import eu.endermite.togglepvp.players.SmartCache; import eu.endermite.togglepvp.util.BoundingBoxUtil; +import eu.endermite.togglepvp.util.CombatTimer; import eu.endermite.togglepvp.util.PluginMessages; import org.bukkit.Location; import org.bukkit.Material; @@ -51,6 +52,7 @@ public class LavaDumpAndIgniteListener implements Listener { event.setCancelled(true); return; } + CombatTimer.refreshPlayersCombatTime(damager.getUniqueId(), victim.getUniqueId()); } } else if (entity instanceof Wolf) { Wolf victim = (Wolf) entity; @@ -70,6 +72,7 @@ public class LavaDumpAndIgniteListener implements Listener { event.setCancelled(true); return; } + CombatTimer.refreshPlayersCombatTime(damager.getUniqueId(), victim.getOwner().getUniqueId()); } catch (NullPointerException ignored) {} } } @@ -106,6 +109,7 @@ public class LavaDumpAndIgniteListener implements Listener { event.setCancelled(true); return; } + CombatTimer.refreshPlayersCombatTime(damager.getUniqueId(), victim.getUniqueId()); } } else if (entity instanceof Wolf) { Wolf victim = (Wolf) entity; @@ -125,6 +129,7 @@ public class LavaDumpAndIgniteListener implements Listener { event.setCancelled(true); return; } + CombatTimer.refreshPlayersCombatTime(damager.getUniqueId(), victim.getOwner().getUniqueId()); } catch (NullPointerException ignored) {} } } diff --git a/src/main/java/eu/endermite/togglepvp/listeners/unspecific/PlaceWitherRoseListener.java b/src/main/java/eu/endermite/togglepvp/listeners/unspecific/PlaceWitherRoseListener.java index 3c037e8..0103d10 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/unspecific/PlaceWitherRoseListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/unspecific/PlaceWitherRoseListener.java @@ -4,6 +4,7 @@ import eu.endermite.togglepvp.TogglePvP; import eu.endermite.togglepvp.config.ConfigCache; import eu.endermite.togglepvp.players.SmartCache; import eu.endermite.togglepvp.util.BoundingBoxUtil; +import eu.endermite.togglepvp.util.CombatTimer; import eu.endermite.togglepvp.util.PluginMessages; import org.bukkit.Location; import org.bukkit.Material; @@ -22,15 +23,12 @@ public class PlaceWitherRoseListener implements Listener { @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void onPlayerWitherRosePlace(org.bukkit.event.block.BlockPlaceEvent event) { - if (!TogglePvP.getPlugin().getConfigCache().isLava_and_fire_stopper_enabled()) return; if(event.getBlock().getType().equals(Material.WITHER_ROSE)) { - Location location = event.getBlockPlaced().getLocation(); double radius = config.getLava_and_fire_stopper_radius(); - BoundingBox boundingBox = BoundingBoxUtil.getBoundingBox(location, radius); for (Entity entity : location.getWorld().getNearbyEntities(boundingBox)) { if (entity instanceof Player) { @@ -49,6 +47,7 @@ public class PlaceWitherRoseListener implements Listener { event.setCancelled(true); return; } + CombatTimer.refreshPlayersCombatTime(damager.getUniqueId(), victim.getUniqueId()); } } else if (entity instanceof Wolf) { Wolf victim = (Wolf) entity; @@ -68,6 +67,7 @@ public class PlaceWitherRoseListener implements Listener { event.setCancelled(true); return; } + CombatTimer.refreshPlayersCombatTime(damager.getUniqueId(), victim.getOwner().getUniqueId()); } } } diff --git a/src/main/java/eu/endermite/togglepvp/listeners/wolf/PlayerAttackWolfListener.java b/src/main/java/eu/endermite/togglepvp/listeners/wolf/PlayerAttackWolfListener.java index bb09928..1dce520 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/wolf/PlayerAttackWolfListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/wolf/PlayerAttackWolfListener.java @@ -3,6 +3,7 @@ package eu.endermite.togglepvp.listeners.wolf; 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; import org.bukkit.entity.Wolf; @@ -37,13 +38,10 @@ public class PlayerAttackWolfListener implements Listener { if (!victimPvpEnabled) { PluginMessages.sendActionBar(damager, config.getCannot_attack_pets_victim()); event.setCancelled(true); + return; } - - + CombatTimer.refreshPlayersCombatTime(damager.getUniqueId(), wolf.getOwner().getUniqueId()); } - } - } - } diff --git a/src/main/java/eu/endermite/togglepvp/listeners/wolf/PlayerHitWolfWithProjectile.java b/src/main/java/eu/endermite/togglepvp/listeners/wolf/PlayerHitWolfWithProjectile.java index 21e2862..5ba0f27 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/wolf/PlayerHitWolfWithProjectile.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/wolf/PlayerHitWolfWithProjectile.java @@ -3,6 +3,7 @@ package eu.endermite.togglepvp.listeners.wolf; 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; import org.bukkit.entity.Projectile; @@ -38,7 +39,9 @@ public class PlayerHitWolfWithProjectile implements Listener { if (!victimPvpEnabled) { event.setCancelled(true); PluginMessages.sendActionBar(damager, config.getCannot_attack_pets_victim()); + return; } + CombatTimer.refreshPlayersCombatTime(damager.getUniqueId(), victim.getOwner().getUniqueId()); } } } diff --git a/src/main/java/eu/endermite/togglepvp/listeners/wolf/WolfHitByExplosionListener.java b/src/main/java/eu/endermite/togglepvp/listeners/wolf/WolfHitByExplosionListener.java index efb2c13..188d098 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/wolf/WolfHitByExplosionListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/wolf/WolfHitByExplosionListener.java @@ -3,6 +3,7 @@ package eu.endermite.togglepvp.listeners.wolf; 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.Wolf; import org.bukkit.event.EventHandler; @@ -40,10 +41,10 @@ public class WolfHitByExplosionListener implements Listener { if (!victimPvpEnabled) { PluginMessages.sendActionBar(damageruuid, config.getCannot_attack_pets_victim()); event.setCancelled(true); + return; } - } catch (NullPointerException | IndexOutOfBoundsException ignored) { - } + CombatTimer.refreshPlayersCombatTime(damageruuid, victim.getOwner().getUniqueId()); + } catch (NullPointerException | IndexOutOfBoundsException ignored) {} } } - } diff --git a/src/main/java/eu/endermite/togglepvp/listeners/wolf/WolfHitByFireworkListener.java b/src/main/java/eu/endermite/togglepvp/listeners/wolf/WolfHitByFireworkListener.java index 271eb3c..e657386 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/wolf/WolfHitByFireworkListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/wolf/WolfHitByFireworkListener.java @@ -1,6 +1,7 @@ package eu.endermite.togglepvp.listeners.wolf; import eu.endermite.togglepvp.TogglePvP; +import eu.endermite.togglepvp.util.CombatTimer; import eu.endermite.togglepvp.util.PluginMessages; import org.bukkit.entity.Firework; import org.bukkit.entity.Player; @@ -32,7 +33,9 @@ public class WolfHitByFireworkListener implements Listener { if (!victimPvpEnabled) { event.setCancelled(true); PluginMessages.sendActionBar(damager.getUniqueId(), TogglePvP.getPlugin().getConfigCache().getCannot_attack_pets_victim()); + return; } + CombatTimer.refreshPlayersCombatTime(damager.getUniqueId(), victim.getOwner().getUniqueId()); } } } diff --git a/src/main/java/eu/endermite/togglepvp/listeners/wolf/WolfHitBySplashPotionListener.java b/src/main/java/eu/endermite/togglepvp/listeners/wolf/WolfHitBySplashPotionListener.java index 9dfb625..bd45739 100644 --- a/src/main/java/eu/endermite/togglepvp/listeners/wolf/WolfHitBySplashPotionListener.java +++ b/src/main/java/eu/endermite/togglepvp/listeners/wolf/WolfHitBySplashPotionListener.java @@ -3,6 +3,7 @@ package eu.endermite.togglepvp.listeners.wolf; 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; import org.bukkit.entity.Player; @@ -63,7 +64,9 @@ public class WolfHitBySplashPotionListener implements Listener { if (!victimPvpEnabled) { event.setIntensity(victim, 0); PluginMessages.sendActionBar(damager, config.getCannot_attack_victim()); + continue; } + CombatTimer.refreshPlayersCombatTime(damager.getUniqueId(), victim.getOwner().getUniqueId()); } } } diff --git a/src/main/java/eu/endermite/togglepvp/players/PlayerManager.java b/src/main/java/eu/endermite/togglepvp/players/PlayerManager.java index 5c7786f..440c343 100644 --- a/src/main/java/eu/endermite/togglepvp/players/PlayerManager.java +++ b/src/main/java/eu/endermite/togglepvp/players/PlayerManager.java @@ -29,10 +29,21 @@ public class PlayerManager { return Instant.now().getEpochSecond()+cacheTime; } + public long refreshedCombatTime() { + long combatTime = TogglePvP.getPlugin().getConfigCache().getCombat_time(); + return Instant.now().getEpochSecond()+combatTime; + } + public void refreshPlayersCacheTime(UUID uuid) { playerList.get(uuid).replace("cachetime", refreshedCacheTime()); } + public void refreshPlayersCombatTime(UUID uuid) { + try { + playerList.get(uuid).replace("combattime", refreshedCombatTime()); + } catch (Exception ignored) {} + } + public HashMap getPlayer(UUID uuid) { return playerList.get(uuid); } diff --git a/src/main/java/eu/endermite/togglepvp/players/SmartCache.java b/src/main/java/eu/endermite/togglepvp/players/SmartCache.java index 9e47e09..971ca57 100644 --- a/src/main/java/eu/endermite/togglepvp/players/SmartCache.java +++ b/src/main/java/eu/endermite/togglepvp/players/SmartCache.java @@ -47,6 +47,7 @@ public class SmartCache { HashMap playerData; playerData = TogglePvP.getPlugin().getSqLite().getPlayerInfo(uuid); playerData.put("cachetime", TogglePvP.getPlugin().getPlayerManager().refreshedCacheTime()); + playerData.put("combattime", Instant.now().getEpochSecond()-1); TogglePvP.getPlugin().getPlayerManager().addPlayer(uuid, playerData); return playerData; } catch (NullPointerException ex) { diff --git a/src/main/java/eu/endermite/togglepvp/util/CombatTimer.java b/src/main/java/eu/endermite/togglepvp/util/CombatTimer.java new file mode 100644 index 0000000..805ef09 --- /dev/null +++ b/src/main/java/eu/endermite/togglepvp/util/CombatTimer.java @@ -0,0 +1,27 @@ +package eu.endermite.togglepvp.util; + +import eu.endermite.togglepvp.TogglePvP; +import eu.endermite.togglepvp.players.SmartCache; + +import java.time.Instant; +import java.util.UUID; + +public class CombatTimer { + + public static void refreshPlayersCombatTime(UUID uuid) { + try { + long now = Instant.now().getEpochSecond(); + long combattime = (long) SmartCache.getPlayerData(uuid).get("combattime"); + if (combattime < now) { + PluginMessages.sendActionBar(uuid, TogglePvP.getPlugin().getConfigCache().getEntering_combat()); + } + TogglePvP.getPlugin().getPlayerManager().refreshPlayersCombatTime(uuid); + } catch (Exception ignored) {} + } + + public static void refreshPlayersCombatTime(UUID attacker_uuid, UUID victim_uuid) { + refreshPlayersCombatTime(attacker_uuid); + refreshPlayersCombatTime(victim_uuid); + } + +} diff --git a/src/main/java/eu/endermite/togglepvp/util/PluginMessages.java b/src/main/java/eu/endermite/togglepvp/util/PluginMessages.java index ca754a3..81f223a 100644 --- a/src/main/java/eu/endermite/togglepvp/util/PluginMessages.java +++ b/src/main/java/eu/endermite/togglepvp/util/PluginMessages.java @@ -34,4 +34,11 @@ public class PluginMessages { return parseMessage(message); } + public static void broadcastMessage(Player player, String message) { + message = parsePlayerName(player, message); + message = parseMessage(message); + BaseComponent[] component = TextComponent.fromLegacyText(parseMessage(message)); + Bukkit.spigot().broadcast(component); + } + } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index fefab2d..6a93307 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -11,6 +11,15 @@ 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 in combat + combat_time: 25 + + # Kill the player if they log out during combat + punish_for_combat_logout: + enabled: true + announce: true + message: "&f%player% logged out while in combat. What a loser." + # 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. @@ -27,3 +36,5 @@ messages: no_such_command: "&cNo such command." pvp_enabled_others: "&cYou've enabled %player%'s PvP." pvp_disabled_others: "&cYou've disabled %player%'s PvP." + entering_combat: "&cEntering combat" + leaving_combat: "&cLeaving combat"