diff --git a/src/main/java/com/massivecraft/factions/FPlayer.java b/src/main/java/com/massivecraft/factions/FPlayer.java index 19c3100e..da2e6d88 100644 --- a/src/main/java/com/massivecraft/factions/FPlayer.java +++ b/src/main/java/com/massivecraft/factions/FPlayer.java @@ -5,6 +5,7 @@ import com.massivecraft.factions.iface.RelationParticipator; import com.massivecraft.factions.struct.ChatMode; import com.massivecraft.factions.struct.Relation; import com.massivecraft.factions.struct.Role; +import com.massivecraft.factions.util.WarmUpUtil; import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.entity.Player; @@ -228,4 +229,19 @@ public interface FPlayer extends EconomyParticipator { public boolean isOffline(); public void setId(String id); + + // ------------------------------- + // Warmups + // ------------------------------- + + public boolean isWarmingUp(); + + public WarmUpUtil.Warmup getWarmupType(); + + public void addWarmup(WarmUpUtil.Warmup warmup, int taskId); + + public void stopWarmup(); + + public void clearWarmup(); + } diff --git a/src/main/java/com/massivecraft/factions/cmd/CmdFWarp.java b/src/main/java/com/massivecraft/factions/cmd/CmdFWarp.java index 9348ef54..989aab74 100644 --- a/src/main/java/com/massivecraft/factions/cmd/CmdFWarp.java +++ b/src/main/java/com/massivecraft/factions/cmd/CmdFWarp.java @@ -50,7 +50,7 @@ public class CmdFWarp extends FCommand { if (!transact(fme)) { return; } - this.doWarmUp(TL.WARMUPS_NOTIFY_TELEPORT, warpName, new Runnable() { + this.doWarmUp(WarmUpUtil.Warmup.WARP, TL.WARMUPS_NOTIFY_TELEPORT, warpName, new Runnable() { @Override public void run() { CmdFWarp.this.fme.getPlayer().teleport(CmdFWarp.this.myFaction.getWarp(warpName).getLocation()); diff --git a/src/main/java/com/massivecraft/factions/cmd/CmdHome.java b/src/main/java/com/massivecraft/factions/cmd/CmdHome.java index 8107d6f8..4657bbcd 100644 --- a/src/main/java/com/massivecraft/factions/cmd/CmdHome.java +++ b/src/main/java/com/massivecraft/factions/cmd/CmdHome.java @@ -5,6 +5,7 @@ import com.massivecraft.factions.integration.Essentials; import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Relation; import com.massivecraft.factions.struct.Role; +import com.massivecraft.factions.util.WarmUpUtil; import com.massivecraft.factions.zcore.util.SmokeUtil; import com.massivecraft.factions.zcore.util.TL; import org.bukkit.Location; @@ -110,7 +111,7 @@ public class CmdHome extends FCommand { return; } - this.doWarmUp(TL.WARMUPS_NOTIFY_TELEPORT, "Home", new Runnable() { + this.doWarmUp(WarmUpUtil.Warmup.HOME, TL.WARMUPS_NOTIFY_TELEPORT, "Home", new Runnable() { @Override public void run() { // Create a smoke effect diff --git a/src/main/java/com/massivecraft/factions/cmd/FCommand.java b/src/main/java/com/massivecraft/factions/cmd/FCommand.java index 9816e008..57402426 100644 --- a/src/main/java/com/massivecraft/factions/cmd/FCommand.java +++ b/src/main/java/com/massivecraft/factions/cmd/FCommand.java @@ -302,11 +302,11 @@ public abstract class FCommand extends MCommand

{ } } - public void doWarmUp(TL translationKey, String action, Runnable runnable, long delay) { - this.doWarmUp(this.fme, translationKey, action, runnable, delay); + public void doWarmUp(WarmUpUtil.Warmup warmup, TL translationKey, String action, Runnable runnable, long delay) { + this.doWarmUp(this.fme, warmup, translationKey, action, runnable, delay); } - public void doWarmUp(FPlayer player, TL translationKey, String action, Runnable runnable, long delay) { - WarmUpUtil.process(player, translationKey, action, runnable, delay); + public void doWarmUp(FPlayer player, WarmUpUtil.Warmup warmup, TL translationKey, String action, Runnable runnable, long delay) { + WarmUpUtil.process(player, warmup, translationKey, action, runnable, delay); } } diff --git a/src/main/java/com/massivecraft/factions/listeners/FactionsEntityListener.java b/src/main/java/com/massivecraft/factions/listeners/FactionsEntityListener.java index 6781b80b..b46d083d 100644 --- a/src/main/java/com/massivecraft/factions/listeners/FactionsEntityListener.java +++ b/src/main/java/com/massivecraft/factions/listeners/FactionsEntityListener.java @@ -114,7 +114,13 @@ public class FactionsEntityListener implements Listener { // entity took generic damage? Entity entity = event.getEntity(); if (entity instanceof Player) { - cancelFStuckTeleport((Player) event.getEntity()); + Player player = (Player) entity; + FPlayer me = FPlayers.getInstance().getByPlayer(player); + cancelFStuckTeleport(player); + if (me.isWarmingUp()) { + me.clearWarmup(); + me.msg(TL.WARMUPS_CANCELLED); + } } } diff --git a/src/main/java/com/massivecraft/factions/listeners/FactionsPlayerListener.java b/src/main/java/com/massivecraft/factions/listeners/FactionsPlayerListener.java index 22633fee..a0e4011c 100644 --- a/src/main/java/com/massivecraft/factions/listeners/FactionsPlayerListener.java +++ b/src/main/java/com/massivecraft/factions/listeners/FactionsPlayerListener.java @@ -122,9 +122,16 @@ public class FactionsPlayerListener implements Listener { @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onPlayerMove(PlayerMoveEvent event) { + Player player = event.getPlayer(); + FPlayer me = FPlayers.getInstance().getByPlayer(player); + // clear visualization if (event.getFrom().getBlockX() != event.getTo().getBlockX() || event.getFrom().getBlockY() != event.getTo().getBlockY() || event.getFrom().getBlockZ() != event.getTo().getBlockZ()) { VisualizeUtil.clear(event.getPlayer()); + if (me.isWarmingUp()) { + me.clearWarmup(); + me.msg(TL.WARMUPS_CANCELLED); + } } // quick check to make sure player is moving between chunks; good performance boost @@ -132,9 +139,6 @@ public class FactionsPlayerListener implements Listener { return; } - Player player = event.getPlayer(); - FPlayer me = FPlayers.getInstance().getByPlayer(player); - // Did we change coord? FLocation from = me.getLastStoodAt(); FLocation to = new FLocation(event.getTo()); diff --git a/src/main/java/com/massivecraft/factions/util/WarmUpUtil.java b/src/main/java/com/massivecraft/factions/util/WarmUpUtil.java index 38c39600..14862ab6 100644 --- a/src/main/java/com/massivecraft/factions/util/WarmUpUtil.java +++ b/src/main/java/com/massivecraft/factions/util/WarmUpUtil.java @@ -15,12 +15,28 @@ public class WarmUpUtil { *

* note: for translations: %s = action, %d = delay */ - public static void process(FPlayer player, TL translationKey, String action, Runnable runnable, long delay) { + public static void process(final FPlayer player, Warmup warmup, TL translationKey, String action, final Runnable runnable, long delay) { if (delay > 0) { - player.msg(translationKey.format(action, delay)); - P.p.getServer().getScheduler().runTaskLater(P.p, runnable, delay * 20); + if (player.isWarmingUp()) { + player.msg(TL.WARMUPS_ALREADY); + } else { + player.msg(translationKey.format(action, delay)); + int id = P.p.getServer().getScheduler().runTaskLater(P.p, new Runnable() { + @Override + public void run() { + player.stopWarmup(); + runnable.run(); + } + }, delay * 20).getTaskId(); + player.addWarmup(warmup, id); + } } else { runnable.run(); } } + + public enum Warmup { + HOME, WARP; + } + } diff --git a/src/main/java/com/massivecraft/factions/zcore/persist/MemoryFPlayer.java b/src/main/java/com/massivecraft/factions/zcore/persist/MemoryFPlayer.java index 7b18b28e..d1876319 100644 --- a/src/main/java/com/massivecraft/factions/zcore/persist/MemoryFPlayer.java +++ b/src/main/java/com/massivecraft/factions/zcore/persist/MemoryFPlayer.java @@ -15,6 +15,7 @@ import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Relation; import com.massivecraft.factions.struct.Role; import com.massivecraft.factions.util.RelationUtil; +import com.massivecraft.factions.util.WarmUpUtil; import com.massivecraft.factions.zcore.util.TL; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -95,6 +96,9 @@ public abstract class MemoryFPlayer implements FPlayer { protected boolean spyingChat = false; protected boolean showScoreboard; + protected WarmUpUtil.Warmup warmup; + protected int warmupTask; + public Faction getFaction() { if (this.factionId == null) { this.factionId = "0"; @@ -883,4 +887,34 @@ public abstract class MemoryFPlayer implements FPlayer { public void setId(String id) { this.id = id; } + + @Override + public void clearWarmup() { + if (warmup != null) { + Bukkit.getScheduler().cancelTask(warmupTask); + this.stopWarmup(); + } + } + + @Override + public void stopWarmup() { + warmup = null; + } + + @Override + public boolean isWarmingUp() { + return warmup != null; + } + + @Override + public WarmUpUtil.Warmup getWarmupType() { + return warmup; + } + + @Override + public void addWarmup(WarmUpUtil.Warmup warmup, int taskId) { + if (this.warmup != null) { + this.clearWarmup(); + } + } } diff --git a/src/main/java/com/massivecraft/factions/zcore/util/TL.java b/src/main/java/com/massivecraft/factions/zcore/util/TL.java index 42cee172..fa71409f 100644 --- a/src/main/java/com/massivecraft/factions/zcore/util/TL.java +++ b/src/main/java/com/massivecraft/factions/zcore/util/TL.java @@ -708,7 +708,9 @@ public enum TL { /** * Warmups */ - WARMUPS_NOTIFY_TELEPORT("&eYou will teleport to &d%1$s &ein &d%2$d &eseconds."); + WARMUPS_NOTIFY_TELEPORT("&eYou will teleport to &d%1$s &ein &d%2$d &eseconds."), + WARMUPS_ALREADY("&cYou are already warming up."), + WARMUPS_CANCELLED("&cYou have cancelled your warmup."); private String path; private String def; diff --git a/src/main/resources/lang/en_US.yml b/src/main/resources/lang/en_US.yml index fbdee82d..93a1406f 100644 --- a/src/main/resources/lang/en_US.yml +++ b/src/main/resources/lang/en_US.yml @@ -501,3 +501,5 @@ faction-logout: '&e%1$s &9logged out..' WARMUPS: NOTIFY: TELEPORT: '&eYou will teleport to &d%1$s &ein &d%2$d &eseconds.' + ALREADY: '&cYou are already warming up.' + CANCELLED: '&cYou have cancelled your warmup.'