From de55825dc10fc905b8d0b009e9da126b4830a3ab Mon Sep 17 00:00:00 2001 From: snowleo Date: Tue, 27 Mar 2012 21:14:38 +0200 Subject: Adds pvp protection after teleport --- .../essentials/EssentialsEntityListener.java | 3 +++ .../essentials/EssentialsPlayerListener.java | 5 ++--- .../com/earth2me/essentials/EssentialsTimer.java | 1 + .../src/com/earth2me/essentials/ISettings.java | 2 ++ .../src/com/earth2me/essentials/Settings.java | 8 ++++++- Essentials/src/com/earth2me/essentials/User.java | 26 +++++++++++++++++++++- Essentials/src/config.yml | 4 ++++ 7 files changed, 44 insertions(+), 5 deletions(-) diff --git a/Essentials/src/com/earth2me/essentials/EssentialsEntityListener.java b/Essentials/src/com/earth2me/essentials/EssentialsEntityListener.java index 524edc16f..029288530 100644 --- a/Essentials/src/com/earth2me/essentials/EssentialsEntityListener.java +++ b/Essentials/src/com/earth2me/essentials/EssentialsEntityListener.java @@ -32,6 +32,9 @@ public class EssentialsEntityListener implements Listener { final User defender = ess.getUser(eDefend); final User attacker = ess.getUser(eAttack); + if (attacker.hasInvulnerabilityAfterTeleport() || defender.hasInvulnerabilityAfterTeleport()) { + event.setCancelled(true); + } attacker.updateActivity(true); final List commandList = attacker.getPowertool(attacker.getItemInHand()); if (commandList != null && !commandList.isEmpty()) diff --git a/Essentials/src/com/earth2me/essentials/EssentialsPlayerListener.java b/Essentials/src/com/earth2me/essentials/EssentialsPlayerListener.java index 6b6b4a034..97ced232d 100644 --- a/Essentials/src/com/earth2me/essentials/EssentialsPlayerListener.java +++ b/Essentials/src/com/earth2me/essentials/EssentialsPlayerListener.java @@ -229,14 +229,13 @@ public class EssentialsPlayerListener implements Listener @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) public void onPlayerTeleport(final PlayerTeleportEvent event) { - + final User user = ess.getUser(event.getPlayer()); //There is TeleportCause.COMMMAND but plugins have to actively pass the cause in on their teleports. if ((event.getCause() == TeleportCause.PLUGIN || event.getCause() == TeleportCause.COMMAND) && ess.getSettings().registerBackInListener()) { - final User user = ess.getUser(event.getPlayer()); user.setLastLocation(); } - + user.enableInvulnerabilityAfterTeleport(); } @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) diff --git a/Essentials/src/com/earth2me/essentials/EssentialsTimer.java b/Essentials/src/com/earth2me/essentials/EssentialsTimer.java index 0c413bfc8..18f980a62 100644 --- a/Essentials/src/com/earth2me/essentials/EssentialsTimer.java +++ b/Essentials/src/com/earth2me/essentials/EssentialsTimer.java @@ -48,6 +48,7 @@ public class EssentialsTimer implements Runnable } user.checkMuteTimeout(currentTime); user.checkJailTimeout(currentTime); + user.resetInvulnerabilityAfterTeleport(); } } } diff --git a/Essentials/src/com/earth2me/essentials/ISettings.java b/Essentials/src/com/earth2me/essentials/ISettings.java index 1ef8feaa9..74942640e 100644 --- a/Essentials/src/com/earth2me/essentials/ISettings.java +++ b/Essentials/src/com/earth2me/essentials/ISettings.java @@ -169,4 +169,6 @@ public interface ISettings extends IConf boolean isMetricsEnabled(); void setMetricsEnabled(boolean metricsEnabled); + + public long getTeleportInvulnerability(); } diff --git a/Essentials/src/com/earth2me/essentials/Settings.java b/Essentials/src/com/earth2me/essentials/Settings.java index 08c3b74db..9dee4e990 100644 --- a/Essentials/src/com/earth2me/essentials/Settings.java +++ b/Essentials/src/com/earth2me/essentials/Settings.java @@ -609,7 +609,7 @@ public class Settings implements ISettings { return config.getBoolean("change-displayname", true); } - + @Override public boolean changePlayerListName() { @@ -745,4 +745,10 @@ public class Settings implements ISettings { this.metricsEnabled = metricsEnabled; } + + @Override + public long getTeleportInvulnerability() + { + return config.getLong("teleport-invulnerability", 0) * 1000; + } } diff --git a/Essentials/src/com/earth2me/essentials/User.java b/Essentials/src/com/earth2me/essentials/User.java index cfa6a4a4a..f931b07d9 100644 --- a/Essentials/src/com/earth2me/essentials/User.java +++ b/Essentials/src/com/earth2me/essentials/User.java @@ -603,8 +603,32 @@ public class User extends UserData implements Comparable, IReplyTo, IUser return invSee; } - public void setInvSee(boolean set) + public void setInvSee(final boolean set) { invSee = set; } + private transient long teleportInvulnerabilityTimestamp = 0; + + public void enableInvulnerabilityAfterTeleport() + { + final long time = ess.getSettings().getTeleportInvulnerability(); + if (time > 0) + { + teleportInvulnerabilityTimestamp = System.currentTimeMillis() + time; + } + } + + public void resetInvulnerabilityAfterTeleport() + { + if (teleportInvulnerabilityTimestamp != 0 + && teleportInvulnerabilityTimestamp < System.currentTimeMillis()) + { + teleportInvulnerabilityTimestamp = 0; + } + } + + public boolean hasInvulnerabilityAfterTeleport() + { + return teleportInvulnerabilityTimestamp != 0 && teleportInvulnerabilityTimestamp >= System.currentTimeMillis(); + } } diff --git a/Essentials/src/config.yml b/Essentials/src/config.yml index 133557030..ec1f3fc8d 100644 --- a/Essentials/src/config.yml +++ b/Essentials/src/config.yml @@ -50,6 +50,10 @@ teleport-cooldown: 0 # The delay, in seconds, before a user actually teleports. If the user moves or gets attacked in this timeframe, the teleport never occurs. teleport-delay: 0 +# The delay, in seconds, a player can't be attacked by other players after he has been teleported by a command +# This will also prevent that the player can attack other players +teleport-invulnerability: 0 + # The delay, in seconds, required between /heal attempts heal-cooldown: 60 -- cgit v1.2.3