From ecfa7454843cb9f4af61127c1a59838c83bf94fd Mon Sep 17 00:00:00 2001 From: KHobbits Date: Sun, 10 Jun 2012 21:55:48 +0100 Subject: [PATCH] Try to be a little more sensible with stored cooldowns. --- .../src/com/earth2me/essentials/Kit.java | 37 ++++++++++++------- .../src/com/earth2me/essentials/Teleport.java | 34 ++++++++++++----- 2 files changed, 48 insertions(+), 23 deletions(-) diff --git a/Essentials/src/com/earth2me/essentials/Kit.java b/Essentials/src/com/earth2me/essentials/Kit.java index 5edd40776..5a907beb3 100644 --- a/Essentials/src/com/earth2me/essentials/Kit.java +++ b/Essentials/src/com/earth2me/essentials/Kit.java @@ -39,26 +39,35 @@ public class Kit public static void checkTime(final User user, final String kitName, final Map els) throws NoChargeException { + final Calendar time = new GregorianCalendar(); + + // Take the current time, and remove the delay from it. final double delay = els.containsKey("delay") ? ((Number)els.get("delay")).doubleValue() : 0L; - final Calendar c = new GregorianCalendar(); - c.add(Calendar.SECOND, -(int)delay); - c.add(Calendar.MILLISECOND, -(int)((delay * 1000.0) % 1000.0)); - - final long mintime = c.getTimeInMillis(); + final Calendar earliestTime = new GregorianCalendar(); + earliestTime.add(Calendar.SECOND, -(int)delay); + earliestTime.add(Calendar.MILLISECOND, -(int)((delay * 1000.0) % 1000.0)); + // This value contains the most recent time a kit could have been used that would allow another use. + final long earliestLong = earliestTime.getTimeInMillis(); + // When was the last kit used? final Long lastTime = user.getKitTimestamp(kitName); - if (lastTime == null || lastTime < mintime) + + if (lastTime == null || lastTime < earliestLong) { - final Calendar now = new GregorianCalendar(); - user.setKitTimestamp(kitName, now.getTimeInMillis()); + user.setKitTimestamp(kitName, time.getTimeInMillis()); + } + else if (lastTime > time.getTimeInMillis()) + { + // This is to make sure time didn't get messed up on last kit use. + // If this happens, let's give the user the benifit of the doubt. + user.setKitTimestamp(kitName, time.getTimeInMillis()); } else { - final Calendar future = new GregorianCalendar(); - future.setTimeInMillis(lastTime); - future.add(Calendar.SECOND, (int)delay); - future.add(Calendar.MILLISECOND, (int)((delay * 1000.0) % 1000.0)); - user.sendMessage(_("kitTimed", Util.formatDateDiff(future.getTimeInMillis()))); + time.setTimeInMillis(lastTime); + time.add(Calendar.SECOND, (int)delay); + time.add(Calendar.MILLISECOND, (int)((delay * 1000.0) % 1000.0)); + user.sendMessage(_("kitTimed", Util.formatDateDiff(time.getTimeInMillis()))); throw new NoChargeException(); } } @@ -77,7 +86,7 @@ public class Kit catch (Exception e) { user.sendMessage(_("kitError2")); - throw new Exception(_("kitErrorHelp"),e); + throw new Exception(_("kitErrorHelp"), e); } } diff --git a/Essentials/src/com/earth2me/essentials/Teleport.java b/Essentials/src/com/earth2me/essentials/Teleport.java index 6569a1689..a920544cb 100644 --- a/Essentials/src/com/earth2me/essentials/Teleport.java +++ b/Essentials/src/com/earth2me/essentials/Teleport.java @@ -145,23 +145,39 @@ public class Teleport implements Runnable, ITeleport public void cooldown(boolean check) throws Exception { - Calendar now = new GregorianCalendar(); + final Calendar time = new GregorianCalendar(); if (user.getLastTeleportTimestamp() > 0) { - double cooldown = ess.getSettings().getTeleportCooldown(); - Calendar cooldownTime = new GregorianCalendar(); - cooldownTime.setTimeInMillis(user.getLastTeleportTimestamp()); - cooldownTime.add(Calendar.SECOND, (int)cooldown); - cooldownTime.add(Calendar.MILLISECOND, (int)((cooldown * 1000.0) % 1000.0)); - if (cooldownTime.after(now) && !user.isAuthorized("essentials.teleport.cooldown.bypass")) + // Take the current time, and remove the delay from it. + final double cooldown = ess.getSettings().getTeleportCooldown(); + final Calendar earliestTime = new GregorianCalendar(); + earliestTime.add(Calendar.SECOND, -(int)cooldown); + earliestTime.add(Calendar.MILLISECOND, -(int)((cooldown * 1000.0) % 1000.0)); + // This value contains the most recent time a teleport could have been used that would allow another use. + final long earliestLong = earliestTime.getTimeInMillis(); + + // When was the last teleport used? + final Long lastTime = user.getLastTeleportTimestamp(); + + if (lastTime > time.getTimeInMillis()) { - throw new Exception(_("timeBeforeTeleport", Util.formatDateDiff(cooldownTime.getTimeInMillis()))); + // This is to make sure time didn't get messed up on last kit use. + // If this happens, let's give the user the benifit of the doubt. + user.setLastTeleportTimestamp(time.getTimeInMillis()); + return; + } + else if (lastTime > earliestLong && !user.isAuthorized("essentials.teleport.cooldown.bypass")) + { + time.setTimeInMillis(lastTime); + time.add(Calendar.SECOND, (int)delay); + time.add(Calendar.MILLISECOND, (int)((delay * 1000.0) % 1000.0)); + throw new Exception(_("timeBeforeTeleport", Util.formatDateDiff(time.getTimeInMillis()))); } } // if justCheck is set, don't update lastTeleport; we're just checking if (!check) { - user.setLastTeleportTimestamp(now.getTimeInMillis()); + user.setLastTeleportTimestamp(time.getTimeInMillis()); } }