diff --git a/Essentials/src/com/earth2me/essentials/ISettings.java b/Essentials/src/com/earth2me/essentials/ISettings.java index 3c6763cbe..71fc7f5dd 100644 --- a/Essentials/src/com/earth2me/essentials/ISettings.java +++ b/Essentials/src/com/earth2me/essentials/ISettings.java @@ -179,4 +179,6 @@ public interface ISettings extends IConf boolean isTeleportInvulnerability(); long getLoginAttackDelay(); + + int getSignUsePerSecond(); } diff --git a/Essentials/src/com/earth2me/essentials/Settings.java b/Essentials/src/com/earth2me/essentials/Settings.java index b1352b6c3..ec317dbfd 100644 --- a/Essentials/src/com/earth2me/essentials/Settings.java +++ b/Essentials/src/com/earth2me/essentials/Settings.java @@ -388,7 +388,8 @@ public class Settings implements ISettings cancelAfkOnMove = _cancelAfkOnMove(); getFreezeAfkPlayers = _getFreezeAfkPlayers(); itemSpawnBl = _getItemSpawnBlacklist(); - loginAttackDelay = _loginAttackDelay(); + loginAttackDelay = _getLoginAttackDelay(); + signUsePerSecond = _getSignUsePerSecond(); kits = _getKits(); chatFormats.clear(); } @@ -808,7 +809,7 @@ public class Settings implements ISettings private long loginAttackDelay; - private long _loginAttackDelay() + private long _getLoginAttackDelay() { return config.getLong("login-attack-delay", 0) * 1000; } @@ -819,4 +820,18 @@ public class Settings implements ISettings return loginAttackDelay; } + private int signUsePerSecond; + + private int _getSignUsePerSecond() + { + final int perSec = config.getInt("sign-use-per-second", 4); + return perSec > 0 ? perSec : 1; + } + + @Override + public int getSignUsePerSecond() + { + return signUsePerSecond; + } + } diff --git a/Essentials/src/com/earth2me/essentials/User.java b/Essentials/src/com/earth2me/essentials/User.java index 1ce991b66..e2cdc2b80 100644 --- a/Essentials/src/com/earth2me/essentials/User.java +++ b/Essentials/src/com/earth2me/essentials/User.java @@ -21,6 +21,7 @@ public class User extends UserData implements Comparable, IReplyTo, IUser private transient final Teleport teleport; private transient long teleportRequestTime; private transient long lastOnlineActivity; + private transient long lastThrottledAction; private transient long lastActivity = System.currentTimeMillis(); private boolean hidden = false; private transient Location afkPosition = null; @@ -669,4 +670,23 @@ public class User extends UserData implements Comparable, IReplyTo, IUser { final boolean set = !vanished; } + + public boolean checkSignThrottle() { + if (isSignThrottled()) { + return true; + } + updateThrottle(); + return false; + } + + public boolean isSignThrottled() + { + final long minTime = lastThrottledAction + (1000 / ess.getSettings().getSignUsePerSecond()); + return (System.currentTimeMillis() < minTime); + } + + public void updateThrottle() + { + lastThrottledAction = System.currentTimeMillis();; + } } diff --git a/Essentials/src/com/earth2me/essentials/UserData.java b/Essentials/src/com/earth2me/essentials/UserData.java index e48ec7b50..76ed79277 100644 --- a/Essentials/src/com/earth2me/essentials/UserData.java +++ b/Essentials/src/com/earth2me/essentials/UserData.java @@ -458,6 +458,17 @@ public abstract class UserData extends PlayerExtension implements IConf config.save(); } + @Deprecated + public boolean isIgnoredPlayer(final String userName) + { + final IUser user = ess.getUser(userName); + if (user == null || !user.isOnline()) + { + return false; + } + return (ignoredPlayers.contains(user.getName().toLowerCase(Locale.ENGLISH)) && !user.isAuthorized("essentials.chat.ignoreexempt")); + } + public boolean isIgnoredPlayer(IUser user) { return (ignoredPlayers.contains(user.getName().toLowerCase(Locale.ENGLISH)) && !user.isAuthorized("essentials.chat.ignoreexempt")); diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandban.java b/Essentials/src/com/earth2me/essentials/commands/Commandban.java index 0094e063e..01e8ab5b3 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandban.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandban.java @@ -40,21 +40,21 @@ public class Commandban extends EssentialsCommand return; } } - + + final String senderName = sender instanceof Player ? ((Player)sender).getDisplayName() : Console.NAME; String banReason; if (args.length > 1) { - banReason = _("banFormat", getFinalArg(args, 1), sender.getName()); + banReason = _("banFormat", getFinalArg(args, 1), senderName); } else { - banReason = _("banFormat", _("defaultBanReason"), sender.getName()); + banReason = _("banFormat", _("defaultBanReason"), senderName); } user.setBanReason(banReason); user.setBanned(true); user.kickPlayer(banReason); - final String senderName = sender instanceof Player ? ((Player)sender).getDisplayName() : Console.NAME; for (Player onlinePlayer : server.getOnlinePlayers()) { diff --git a/Essentials/src/com/earth2me/essentials/commands/Commanditemdb.java b/Essentials/src/com/earth2me/essentials/commands/Commanditemdb.java index a07c81e25..8a408924d 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commanditemdb.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commanditemdb.java @@ -39,7 +39,7 @@ public class Commanditemdb extends EssentialsCommand if (itemStack.getType() != Material.AIR) { int maxuses = itemStack.getType().getMaxDurability(); - int durability = ((itemStack.getType().getMaxDurability() + 1) - itemStack.getDurability()); + int durability = ((maxuses + 1) - itemStack.getDurability()); if (maxuses != 0) { sender.sendMessage(_("durability", Integer.toString(durability))); diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandtempban.java b/Essentials/src/com/earth2me/essentials/commands/Commandtempban.java index 25c457a20..0549e9c0d 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandtempban.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandtempban.java @@ -44,12 +44,12 @@ public class Commandtempban extends EssentialsCommand final String time = getFinalArg(args, 1); final long banTimestamp = Util.parseDateDiff(time, true); - final String banReason = _("tempBanned", Util.formatDateDiff(banTimestamp)); + final String senderName = sender instanceof Player ? ((Player)sender).getDisplayName() : Console.NAME; + final String banReason = _("tempBanned", Util.formatDateDiff(banTimestamp), senderName); user.setBanReason(banReason); user.setBanTimeout(banTimestamp); user.setBanned(true); user.kickPlayer(banReason); - final String senderName = sender instanceof Player ? ((Player)sender).getDisplayName() : Console.NAME; for (Player onlinePlayer : server.getOnlinePlayers()) { diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandvanish.java b/Essentials/src/com/earth2me/essentials/commands/Commandvanish.java index dca489fea..ea051e4be 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandvanish.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandvanish.java @@ -3,7 +3,6 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.User; import org.bukkit.Server; -import org.bukkit.entity.Player; public class Commandvanish extends EssentialsCommand @@ -30,7 +29,7 @@ public class Commandvanish extends EssentialsCommand } else { - if (args[1].contains("on") || args[1].contains("ena") || args[1].equalsIgnoreCase("1")) + if (args[0].contains("on") || args[0].contains("ena") || args[0].equalsIgnoreCase("1")) { user.setVanished(true); } diff --git a/Essentials/src/com/earth2me/essentials/signs/EssentialsSign.java b/Essentials/src/com/earth2me/essentials/signs/EssentialsSign.java index 21e70516e..389effc64 100644 --- a/Essentials/src/com/earth2me/essentials/signs/EssentialsSign.java +++ b/Essentials/src/com/earth2me/essentials/signs/EssentialsSign.java @@ -76,6 +76,10 @@ public class EssentialsSign { final ISign sign = new BlockSign(block); final User user = ess.getUser(player); + if (user.checkSignThrottle()) + { + return false; + } try { return (user.isAuthorized("essentials.signs." + signName.toLowerCase(Locale.ENGLISH) + ".use") diff --git a/Essentials/src/config.yml b/Essentials/src/config.yml index 0458d0f3f..391578791 100644 --- a/Essentials/src/config.yml +++ b/Essentials/src/config.yml @@ -222,6 +222,12 @@ enabledSigns: #- time #- weather #- protection + + +# How many times per second can Essentials signs be interacted with. +# Values should be between 1-20, 20 being virtually no lag protection.s +# Lower numbers will reduce the possiblity of lag, but may annoy players. +sign-use-per-second: 4 # Backup runs a command while saving is disabled backup: diff --git a/Essentials/src/items.csv b/Essentials/src/items.csv index 2338ce287..75d651aec 100644 --- a/Essentials/src/items.csv +++ b/Essentials/src/items.csv @@ -2586,6 +2586,8 @@ uncookedbeef,363,0 uncookedsteak,363,0 cowmeat,363,0 plainbeef,363,0 +beef,364,0 +steak,364,0 cookedbeef,364,0 grilledbeef,364,0 cookedsteak,364,0