Update essentials to support 3rd party vanish toggling.

This commit is contained in:
KHobbits 2014-06-27 01:46:37 +01:00
parent 0f6625aea9
commit 6269ce9a3f
14 changed files with 122 additions and 46 deletions

View file

@ -44,21 +44,26 @@ public class PlayerList
} }
// Produce a user summary: There are 5 out of maximum 10 players online. // Produce a user summary: There are 5 out of maximum 10 players online.
public static String listSummary(final IEssentials ess, final boolean showHidden) public static String listSummary(final IEssentials ess, final User user, final boolean showHidden)
{ {
Server server = ess.getServer(); Server server = ess.getServer();
int playerHidden = 0; int playerHidden = 0;
int hiddenCount = 0;
for (Player onlinePlayer : server.getOnlinePlayers()) for (Player onlinePlayer : server.getOnlinePlayers())
{ {
if (ess.getUser(onlinePlayer).isHidden()) if (ess.getUser(onlinePlayer).isHidden(user.getBase()))
{ {
playerHidden++; playerHidden++;
if (showHidden || user.getBase().canSee(onlinePlayer))
{
hiddenCount++;
}
} }
} }
String online; String online;
if (showHidden && playerHidden > 0) if (hiddenCount > 0)
{ {
online = tl("listAmountHidden", server.getOnlinePlayers().length - playerHidden, playerHidden, server.getMaxPlayers()); online = tl("listAmountHidden", server.getOnlinePlayers().length - playerHidden, hiddenCount, server.getMaxPlayers());
} }
else else
{ {
@ -68,14 +73,14 @@ public class PlayerList
} }
// Build the basic player list, divided by groups. // Build the basic player list, divided by groups.
public static Map<String, List<User>> getPlayerLists(final IEssentials ess, final boolean showHidden) public static Map<String, List<User>> getPlayerLists(final IEssentials ess, final User sender, final boolean showHidden)
{ {
Server server = ess.getServer(); Server server = ess.getServer();
final Map<String, List<User>> playerList = new HashMap<String, List<User>>(); final Map<String, List<User>> playerList = new HashMap<String, List<User>>();
for (Player onlinePlayer : server.getOnlinePlayers()) for (Player onlinePlayer : server.getOnlinePlayers())
{ {
final User onlineUser = ess.getUser(onlinePlayer); final User onlineUser = ess.getUser(onlinePlayer);
if (onlineUser.isHidden() && !showHidden) if (onlineUser.isHidden(sender.getBase()) && !showHidden && (sender != null && !sender.getBase().canSee(onlinePlayer)))
{ {
continue; continue;
} }

View file

@ -535,6 +535,11 @@ public class User extends UserData implements Comparable<User>, IReplyTo, net.es
return hidden; return hidden;
} }
public boolean isHidden(final Player player)
{
return hidden || !player.canSee(getBase());
}
@Override @Override
public void setHidden(final boolean hidden) public void setHidden(final boolean hidden)
{ {
@ -752,6 +757,11 @@ public class User extends UserData implements Comparable<User>, IReplyTo, net.es
return teleportInvulnerabilityTimestamp != 0 && teleportInvulnerabilityTimestamp >= System.currentTimeMillis(); return teleportInvulnerabilityTimestamp != 0 && teleportInvulnerabilityTimestamp >= System.currentTimeMillis();
} }
public boolean canInteractVanished()
{
return isAuthorized("essentials.vanish.interact");
}
@Override @Override
public boolean isVanished() public boolean isVanished()
{ {

View file

@ -117,13 +117,13 @@ public class Commandexp extends EssentialsCommand
private void showMatch(final Server server, final CommandSource sender, final String match) throws PlayerNotFoundException private void showMatch(final Server server, final CommandSource sender, final String match) throws PlayerNotFoundException
{ {
boolean skipHidden = sender.isPlayer() && !ess.getUser(sender.getPlayer()).isAuthorized("essentials.vanish.interact"); boolean skipHidden = sender.isPlayer() && !ess.getUser(sender.getPlayer()).canInteractVanished();
boolean foundUser = false; boolean foundUser = false;
final List<Player> matchedPlayers = server.matchPlayer(match); final List<Player> matchedPlayers = server.matchPlayer(match);
for (Player matchPlayer : matchedPlayers) for (Player matchPlayer : matchedPlayers)
{ {
final User player = ess.getUser(matchPlayer); final User player = ess.getUser(matchPlayer);
if (skipHidden && player.isHidden()) if (skipHidden && player.isHidden(sender.getPlayer()) && !sender.getPlayer().canSee(matchPlayer))
{ {
continue; continue;
} }
@ -138,13 +138,13 @@ public class Commandexp extends EssentialsCommand
private void expMatch(final Server server, final CommandSource sender, final String match, String amount, final boolean give) throws NotEnoughArgumentsException, PlayerNotFoundException private void expMatch(final Server server, final CommandSource sender, final String match, String amount, final boolean give) throws NotEnoughArgumentsException, PlayerNotFoundException
{ {
boolean skipHidden = sender.isPlayer() && !ess.getUser(sender.getPlayer()).isAuthorized("essentials.vanish.interact"); boolean skipHidden = sender.isPlayer() && !ess.getUser(sender.getPlayer()).canInteractVanished();
boolean foundUser = false; boolean foundUser = false;
final List<Player> matchedPlayers = server.matchPlayer(match); final List<Player> matchedPlayers = server.matchPlayer(match);
for (Player matchPlayer : matchedPlayers) for (Player matchPlayer : matchedPlayers)
{ {
final User player = ess.getUser(matchPlayer); final User player = ess.getUser(matchPlayer);
if (skipHidden && player.isHidden()) if (skipHidden && player.isHidden(sender.getPlayer()) && !sender.getPlayer().canSee(matchPlayer))
{ {
continue; continue;
} }

View file

@ -84,13 +84,13 @@ public class Commandgamemode extends EssentialsCommand
throw new NotEnoughArgumentsException(tl("gameModeInvalid")); throw new NotEnoughArgumentsException(tl("gameModeInvalid"));
} }
boolean skipHidden = sender.isPlayer() && !ess.getUser(sender.getPlayer()).isAuthorized("essentials.vanish.interact"); boolean skipHidden = sender.isPlayer() && !ess.getUser(sender.getPlayer()).canInteractVanished();
boolean foundUser = false; boolean foundUser = false;
final List<Player> matchedPlayers = server.matchPlayer(name); final List<Player> matchedPlayers = server.matchPlayer(name);
for (Player matchPlayer : matchedPlayers) for (Player matchPlayer : matchedPlayers)
{ {
final User player = ess.getUser(matchPlayer); final User player = ess.getUser(matchPlayer);
if (skipHidden && player.isHidden()) if (skipHidden && player.isHidden(sender.getPlayer()) && !sender.getPlayer().canSee(matchPlayer))
{ {
continue; continue;
} }

View file

@ -28,7 +28,7 @@ public class Commandkick extends EssentialsCommand
if (sender.isPlayer()) if (sender.isPlayer())
{ {
User user = ess.getUser(sender.getPlayer()); User user = ess.getUser(sender.getPlayer());
if (target.isHidden() && !user.isAuthorized("essentials.vanish.interact")) if (target.isHidden(sender.getPlayer()) && !user.canInteractVanished() && !sender.getPlayer().canSee(target.getBase()))
{ {
throw new PlayerNotFoundException(); throw new PlayerNotFoundException();
} }

View file

@ -21,12 +21,14 @@ public class Commandlist extends EssentialsCommand
public void run(final Server server, final CommandSource sender, final String commandLabel, final String[] args) throws Exception public void run(final Server server, final CommandSource sender, final String commandLabel, final String[] args) throws Exception
{ {
boolean showHidden = true; boolean showHidden = true;
User user = null;
if (sender.isPlayer()) if (sender.isPlayer())
{ {
showHidden = ess.getUser(sender.getPlayer()).isAuthorized("essentials.list.hidden") || ess.getUser(sender.getPlayer()).isAuthorized("essentials.vanish.interact"); user = ess.getUser(sender.getPlayer());
showHidden = user.isAuthorized("essentials.list.hidden") || user.canInteractVanished();
} }
sender.sendMessage(PlayerList.listSummary(ess, showHidden)); sender.sendMessage(PlayerList.listSummary(ess, user, showHidden));
final Map<String, List<User>> playerList = PlayerList.getPlayerLists(ess, showHidden); final Map<String, List<User>> playerList = PlayerList.getPlayerLists(ess, user, showHidden);
if (args.length > 0) if (args.length > 0)
{ {

View file

@ -101,12 +101,12 @@ public class Commandnear extends EssentialsCommand
final World world = loc.getWorld(); final World world = loc.getWorld();
final StringBuilder output = new StringBuilder(); final StringBuilder output = new StringBuilder();
final long radiusSquared = radius * radius; final long radiusSquared = radius * radius;
boolean showHidden = user.isAuthorized("essentials.vanish.interact"); boolean showHidden = user.canInteractVanished();
for (Player onlinePlayer : server.getOnlinePlayers()) for (Player onlinePlayer : server.getOnlinePlayers())
{ {
final User player = ess.getUser(onlinePlayer); final User player = ess.getUser(onlinePlayer);
if (!player.equals(user) && (!player.isHidden() || showHidden)) if (!player.equals(user) && (!player.isHidden(user.getBase()) || showHidden || user.getBase().canSee(onlinePlayer)))
{ {
final Location playerLoc = player.getLocation(); final Location playerLoc = player.getLocation();
if (playerLoc.getWorld() != world) if (playerLoc.getWorld() != world)

View file

@ -27,7 +27,14 @@ public class Commandpay extends EssentialsLoopCommand
throw new NotEnoughArgumentsException(); throw new NotEnoughArgumentsException();
} }
amount = new BigDecimal(args[1].replaceAll("[^0-9\\.]", "")); String stringAmount = args[1].replaceAll("[^0-9\\.]", "");
if (stringAmount.length() < 1)
{
throw new NotEnoughArgumentsException();
}
amount = new BigDecimal(stringAmount);
loopOnlinePlayers(server, user.getSource(), false, user.isAuthorized("essentials.pay.multiple"), args[0], args); loopOnlinePlayers(server, user.getSource(), false, user.isAuthorized("essentials.pay.multiple"), args[0], args);
} }

View file

@ -24,12 +24,12 @@ public class Commandrealname extends EssentialsCommand
throw new NotEnoughArgumentsException(); throw new NotEnoughArgumentsException();
} }
final String whois = args[0].toLowerCase(Locale.ENGLISH); final String whois = args[0].toLowerCase(Locale.ENGLISH);
boolean skipHidden = sender.isPlayer() && !ess.getUser(sender.getPlayer()).isAuthorized("essentials.vanish.interact"); boolean skipHidden = sender.isPlayer() && !ess.getUser(sender.getPlayer()).canInteractVanished();
boolean foundUser = false; boolean foundUser = false;
for (Player onlinePlayer : server.getOnlinePlayers()) for (Player onlinePlayer : server.getOnlinePlayers())
{ {
final User u = ess.getUser(onlinePlayer); final User u = ess.getUser(onlinePlayer);
if (skipHidden && u.isHidden()) if (skipHidden && u.isHidden(sender.getPlayer()) && !sender.getPlayer().canSee(onlinePlayer))
{ {
continue; continue;
} }

View file

@ -72,13 +72,13 @@ public class Commandspeed extends EssentialsCommand
private void speedOtherPlayers(final Server server, final CommandSource sender, final boolean isFly, final boolean isBypass, final float speed, final String name) throws PlayerNotFoundException private void speedOtherPlayers(final Server server, final CommandSource sender, final boolean isFly, final boolean isBypass, final float speed, final String name) throws PlayerNotFoundException
{ {
boolean skipHidden = sender.isPlayer() && !ess.getUser(sender.getPlayer()).isAuthorized("essentials.vanish.interact"); boolean skipHidden = sender.isPlayer() && !ess.getUser(sender.getPlayer()).canInteractVanished();
boolean foundUser = false; boolean foundUser = false;
final List<Player> matchedPlayers = server.matchPlayer(name); final List<Player> matchedPlayers = server.matchPlayer(name);
for (Player matchPlayer : matchedPlayers) for (Player matchPlayer : matchedPlayers)
{ {
final User player = ess.getUser(matchPlayer); final User player = ess.getUser(matchPlayer);
if (skipHidden && player.isHidden()) if (skipHidden && player.isHidden(sender.getPlayer()) && !sender.getPlayer().canSee(matchPlayer))
{ {
continue; continue;
} }

View file

@ -54,10 +54,21 @@ public abstract class EssentialsCommand implements IEssentialsCommand
return getPlayer(server, args, pos, true, false); return getPlayer(server, args, pos, true, false);
} }
// Get online players - only show vanished if source has permission
protected User getPlayer(final Server server, final CommandSource sender, final String searchTerm) throws PlayerNotFoundException, NotEnoughArgumentsException
{
if (sender.isPlayer())
{
User user = ess.getUser(sender.getPlayer());
return getPlayer(server, user, searchTerm, user.canInteractVanished(), false);
}
return getPlayer(server, searchTerm, true, false);
}
// Get online players - only show vanished if source has permission // Get online players - only show vanished if source has permission
protected User getPlayer(final Server server, final User user, final String[] args, final int pos) throws PlayerNotFoundException, NotEnoughArgumentsException protected User getPlayer(final Server server, final User user, final String[] args, final int pos) throws PlayerNotFoundException, NotEnoughArgumentsException
{ {
return getPlayer(server, user, args, pos, user.isAuthorized("essentials.vanish.interact"), false); return getPlayer(server, user, args, pos, user.canInteractVanished(), false);
} }
// Get online or offline players, this method allows for raw access // Get online or offline players, this method allows for raw access
@ -114,11 +125,12 @@ public abstract class EssentialsCommand implements IEssentialsCommand
{ {
throw new PlayerNotFoundException(); throw new PlayerNotFoundException();
} }
if (!getHidden && user.isHidden() && !user.equals(sourceUser))
if (getHidden || canInteractWith(sourceUser, user))
{ {
throw new PlayerNotFoundException(); return user;
} }
return user; throw new PlayerNotFoundException();
} }
final List<Player> matches = server.matchPlayer(searchTerm); final List<Player> matches = server.matchPlayer(searchTerm);
@ -128,7 +140,8 @@ public abstract class EssentialsCommand implements IEssentialsCommand
for (Player onlinePlayer : server.getOnlinePlayers()) for (Player onlinePlayer : server.getOnlinePlayers())
{ {
final User userMatch = ess.getUser(onlinePlayer); final User userMatch = ess.getUser(onlinePlayer);
if (getHidden || !userMatch.isHidden() || userMatch.equals(sourceUser))
if (getHidden || canInteractWith(sourceUser, userMatch))
{ {
final String displayName = FormatUtil.stripFormat(userMatch.getDisplayName()).toLowerCase(Locale.ENGLISH); final String displayName = FormatUtil.stripFormat(userMatch.getDisplayName()).toLowerCase(Locale.ENGLISH);
if (displayName.contains(matchText)) if (displayName.contains(matchText))
@ -143,13 +156,13 @@ public abstract class EssentialsCommand implements IEssentialsCommand
for (Player player : matches) for (Player player : matches)
{ {
final User userMatch = ess.getUser(player); final User userMatch = ess.getUser(player);
if (userMatch.getDisplayName().startsWith(searchTerm) && (getHidden || !userMatch.isHidden() || userMatch.equals(sourceUser))) if (userMatch.getDisplayName().startsWith(searchTerm) && (getHidden || canInteractWith(sourceUser, userMatch)))
{ {
return userMatch; return userMatch;
} }
} }
final User userMatch = ess.getUser(matches.get(0)); final User userMatch = ess.getUser(matches.get(0));
if (getHidden || !userMatch.isHidden() || userMatch.equals(sourceUser)) if (getHidden || canInteractWith(sourceUser, userMatch))
{ {
return userMatch; return userMatch;
} }
@ -199,4 +212,19 @@ public abstract class EssentialsCommand implements IEssentialsCommand
} }
return bldr.toString(); return bldr.toString();
} }
private static boolean canInteractWith(User interactor, User interactee)
{
if (interactor == null)
{
return !interactee.isHidden();
}
if (interactor.equals(interactee))
{
return true;
}
return interactor.getBase().canSee(interactee.getBase());
}
} }

View file

@ -3,7 +3,9 @@ package com.earth2me.essentials.commands;
import com.earth2me.essentials.ChargeException; import com.earth2me.essentials.ChargeException;
import com.earth2me.essentials.CommandSource; import com.earth2me.essentials.CommandSource;
import com.earth2me.essentials.User; import com.earth2me.essentials.User;
import com.earth2me.essentials.utils.FormatUtil;
import java.util.List; import java.util.List;
import java.util.Locale;
import java.util.UUID; import java.util.UUID;
import net.ess3.api.MaxMoneyException; import net.ess3.api.MaxMoneyException;
import org.bukkit.Server; import org.bukkit.Server;
@ -35,11 +37,11 @@ public abstract class EssentialsLoopCommand extends EssentialsCommand
} }
else if (matchWildcards && searchTerm.contentEquals("*")) else if (matchWildcards && searchTerm.contentEquals("*"))
{ {
boolean skipHidden = sender.isPlayer() && !ess.getUser(sender.getPlayer()).isAuthorized("essentials.vanish.interact"); boolean skipHidden = sender.isPlayer() && !ess.getUser(sender.getPlayer()).canInteractVanished();
for (Player onlinePlayer : server.getOnlinePlayers()) for (Player onlinePlayer : server.getOnlinePlayers())
{ {
final User onlineUser = ess.getUser(onlinePlayer); final User onlineUser = ess.getUser(onlinePlayer);
if (skipHidden && onlineUser.isHidden()) if (skipHidden && onlineUser.isHidden(sender.getPlayer()) && !sender.getPlayer().canSee(onlinePlayer))
{ {
continue; continue;
} }
@ -79,14 +81,14 @@ public abstract class EssentialsLoopCommand extends EssentialsCommand
throw new PlayerNotFoundException(); throw new PlayerNotFoundException();
} }
boolean skipHidden = sender.isPlayer() && !ess.getUser(sender.getPlayer()).isAuthorized("essentials.vanish.interact"); boolean skipHidden = sender.isPlayer() && !ess.getUser(sender.getPlayer()).canInteractVanished();
if (matchWildcards && (searchTerm.contentEquals("**") || searchTerm.contentEquals("*"))) if (matchWildcards && (searchTerm.contentEquals("**") || searchTerm.contentEquals("*")))
{ {
for (Player onlinePlayer : server.getOnlinePlayers()) for (Player onlinePlayer : server.getOnlinePlayers())
{ {
final User onlineUser = ess.getUser(onlinePlayer); final User onlineUser = ess.getUser(onlinePlayer);
if (skipHidden && onlineUser.isHidden()) if (skipHidden && onlineUser.isHidden(sender.getPlayer()) && !sender.getPlayer().canSee(onlinePlayer))
{ {
continue; continue;
} }
@ -101,15 +103,37 @@ public abstract class EssentialsLoopCommand extends EssentialsCommand
} }
boolean foundUser = false; boolean foundUser = false;
final List<Player> matchedPlayers = server.matchPlayer(searchTerm); final List<Player> matchedPlayers = server.matchPlayer(searchTerm);
for (Player matchPlayer : matchedPlayers)
if (matchedPlayers.isEmpty())
{ {
final User player = ess.getUser(matchPlayer); final String matchText = searchTerm.toLowerCase(Locale.ENGLISH);
if (skipHidden && player.isHidden()) for (Player onlinePlayer : server.getOnlinePlayers())
{ {
continue; final User player = ess.getUser(onlinePlayer);
if (skipHidden && player.isHidden(sender.getPlayer()) && !sender.getPlayer().canSee(onlinePlayer))
{
continue;
}
final String displayName = FormatUtil.stripFormat(player.getDisplayName()).toLowerCase(Locale.ENGLISH);
if (displayName.contains(matchText))
{
foundUser = true;
updatePlayer(server, sender, player, commandArgs);
}
}
}
else
{
for (Player matchPlayer : matchedPlayers)
{
final User player = ess.getUser(matchPlayer);
if (skipHidden && player.isHidden(sender.getPlayer()) && !sender.getPlayer().canSee(matchPlayer))
{
continue;
}
foundUser = true;
updatePlayer(server, sender, player, commandArgs);
} }
foundUser = true;
updatePlayer(server, sender, player, commandArgs);
} }
if (!foundUser) if (!foundUser)
{ {
@ -118,7 +142,7 @@ public abstract class EssentialsLoopCommand extends EssentialsCommand
} }
else else
{ {
final User player = getPlayer(server, searchTerm, !skipHidden, false); final User player = getPlayer(server, sender, searchTerm);
updatePlayer(server, sender, player, commandArgs); updatePlayer(server, sender, player, commandArgs);
} }
} }

View file

@ -37,13 +37,13 @@ public abstract class EssentialsToggleCommand extends EssentialsCommand
throw new PlayerNotFoundException(); throw new PlayerNotFoundException();
} }
boolean skipHidden = sender.isPlayer() && !ess.getUser(sender.getPlayer()).isAuthorized("essentials.vanish.interact"); boolean skipHidden = sender.isPlayer() && !ess.getUser(sender.getPlayer()).canInteractVanished();
boolean foundUser = false; boolean foundUser = false;
final List<Player> matchedPlayers = server.matchPlayer(args[0]); final List<Player> matchedPlayers = server.matchPlayer(args[0]);
for (Player matchPlayer : matchedPlayers) for (Player matchPlayer : matchedPlayers)
{ {
final User player = ess.getUser(matchPlayer); final User player = ess.getUser(matchPlayer);
if (skipHidden && player.isHidden()) if (skipHidden && player.isHidden(sender.getPlayer()) && !sender.getPlayer().canSee(matchPlayer))
{ {
continue; continue;
} }

View file

@ -205,11 +205,11 @@ public class KeywordReplacer implements IText
} }
else else
{ {
showHidden = user.isAuthorized("essentials.list.hidden") || user.isAuthorized("essentials.vanish.interact"); showHidden = user.isAuthorized("essentials.list.hidden") || user.canInteractVanished();
} }
//First lets build the per group playerlist //First lets build the per group playerlist
final Map<String, List<User>> playerList = PlayerList.getPlayerLists(ess, showHidden); final Map<String, List<User>> playerList = PlayerList.getPlayerLists(ess, user, showHidden);
outputList = new HashMap<String, String>(); outputList = new HashMap<String, String>();
for (String groupName : playerList.keySet()) for (String groupName : playerList.keySet())
{ {