mirror of
https://github.com/essentials/Essentials.git
synced 2025-08-05 22:27:23 +02:00
Merge branch '2.9' of https://ElgarL@github.com/essentials/Essentials.git into 2.9
This commit is contained in:
@@ -7,6 +7,7 @@ import java.util.logging.Logger;
|
|||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.entity.Ageable;
|
import org.bukkit.entity.Ageable;
|
||||||
import org.bukkit.entity.Entity;
|
import org.bukkit.entity.Entity;
|
||||||
|
import org.bukkit.entity.LivingEntity;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.EventPriority;
|
import org.bukkit.event.EventPriority;
|
||||||
@@ -46,7 +47,7 @@ public class EssentialsEntityListener implements Listener
|
|||||||
{
|
{
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (attacker.isGodModeEnabled() && !attacker.isAuthorized("essentials.god.pvp"))
|
if (attacker.isGodModeEnabled() && !attacker.isAuthorized("essentials.god.pvp"))
|
||||||
{
|
{
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
@@ -161,4 +162,16 @@ public class EssentialsEntityListener implements Listener
|
|||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
|
||||||
|
public void onPotionSplashEvent(final PotionSplashEvent event)
|
||||||
|
{
|
||||||
|
for (LivingEntity entity : event.getAffectedEntities())
|
||||||
|
{
|
||||||
|
if (entity instanceof Player && ess.getUser(entity).isGodModeEnabled())
|
||||||
|
{
|
||||||
|
event.setIntensity(entity, 0d);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -37,13 +37,14 @@ public class Teleport implements Runnable, ITeleport
|
|||||||
{
|
{
|
||||||
if (this.name != null)
|
if (this.name != null)
|
||||||
{
|
{
|
||||||
|
|
||||||
return ess.getServer().getPlayerExact(name).getLocation();
|
return ess.getServer().getPlayerExact(name).getLocation();
|
||||||
}
|
}
|
||||||
return location;
|
return location;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private IUser user;
|
private IUser user;
|
||||||
|
private IUser teleportUser;
|
||||||
private int teleTimer = -1;
|
private int teleTimer = -1;
|
||||||
private long started; // time this task was initiated
|
private long started; // time this task was initiated
|
||||||
private long delay; // how long to delay the teleport
|
private long delay; // how long to delay the teleport
|
||||||
@@ -61,13 +62,19 @@ public class Teleport implements Runnable, ITeleport
|
|||||||
private TeleportCause cause;
|
private TeleportCause cause;
|
||||||
|
|
||||||
private void initTimer(long delay, Target target, Trade chargeFor, TeleportCause cause)
|
private void initTimer(long delay, Target target, Trade chargeFor, TeleportCause cause)
|
||||||
|
{
|
||||||
|
initTimer(delay, user, target, chargeFor, cause);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void initTimer(long delay, IUser teleportUser, Target target, Trade chargeFor, TeleportCause cause)
|
||||||
{
|
{
|
||||||
this.started = System.currentTimeMillis();
|
this.started = System.currentTimeMillis();
|
||||||
this.delay = delay;
|
this.delay = delay;
|
||||||
this.health = user.getHealth();
|
this.health = teleportUser.getHealth();
|
||||||
this.initX = Math.round(user.getLocation().getX() * MOVE_CONSTANT);
|
this.initX = Math.round(teleportUser.getLocation().getX() * MOVE_CONSTANT);
|
||||||
this.initY = Math.round(user.getLocation().getY() * MOVE_CONSTANT);
|
this.initY = Math.round(teleportUser.getLocation().getY() * MOVE_CONSTANT);
|
||||||
this.initZ = Math.round(user.getLocation().getZ() * MOVE_CONSTANT);
|
this.initZ = Math.round(teleportUser.getLocation().getZ() * MOVE_CONSTANT);
|
||||||
|
this.teleportUser = teleportUser;
|
||||||
this.teleportTarget = target;
|
this.teleportTarget = target;
|
||||||
this.chargeFor = chargeFor;
|
this.chargeFor = chargeFor;
|
||||||
this.cause = cause;
|
this.cause = cause;
|
||||||
@@ -79,31 +86,38 @@ public class Teleport implements Runnable, ITeleport
|
|||||||
|
|
||||||
if (user == null || !user.isOnline() || user.getLocation() == null)
|
if (user == null || !user.isOnline() || user.getLocation() == null)
|
||||||
{
|
{
|
||||||
cancel();
|
cancel(false);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (Math.round(user.getLocation().getX() * MOVE_CONSTANT) != initX
|
if (teleportUser == null || !teleportUser.isOnline() || teleportUser.getLocation() == null)
|
||||||
|| Math.round(user.getLocation().getY() * MOVE_CONSTANT) != initY
|
{
|
||||||
|| Math.round(user.getLocation().getZ() * MOVE_CONSTANT) != initZ
|
cancel(false);
|
||||||
|| user.getHealth() < health)
|
return;
|
||||||
{ // user moved, cancel teleport
|
}
|
||||||
|
|
||||||
|
if (!user.isAuthorized("essentials.teleport.timer.move")
|
||||||
|
&& (Math.round(teleportUser.getLocation().getX() * MOVE_CONSTANT) != initX
|
||||||
|
|| Math.round(teleportUser.getLocation().getY() * MOVE_CONSTANT) != initY
|
||||||
|
|| Math.round(teleportUser.getLocation().getZ() * MOVE_CONSTANT) != initZ
|
||||||
|
|| teleportUser.getHealth() < health))
|
||||||
|
{
|
||||||
|
// user moved, cancel teleport
|
||||||
cancel(true);
|
cancel(true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
health = teleportUser.getHealth(); // in case user healed, then later gets injured
|
||||||
health = user.getHealth(); // in case user healed, then later gets injured
|
|
||||||
|
|
||||||
long now = System.currentTimeMillis();
|
long now = System.currentTimeMillis();
|
||||||
if (now > started + delay)
|
if (now > started + delay)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
cooldown(false);
|
cooldown(false);
|
||||||
user.sendMessage(_("teleportationCommencing"));
|
teleportUser.sendMessage(_("teleportationCommencing"));
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
|
||||||
now(teleportTarget, cause);
|
teleportUser.getTeleport().now(teleportTarget, cause);
|
||||||
|
cancel(false);
|
||||||
if (chargeFor != null)
|
if (chargeFor != null)
|
||||||
{
|
{
|
||||||
chargeFor.charge(user);
|
chargeFor.charge(user);
|
||||||
@@ -117,6 +131,10 @@ public class Teleport implements Runnable, ITeleport
|
|||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
user.sendMessage(_("cooldownWithMessage", ex.getMessage()));
|
user.sendMessage(_("cooldownWithMessage", ex.getMessage()));
|
||||||
|
if (user != teleportUser)
|
||||||
|
{
|
||||||
|
teleportUser.sendMessage(_("cooldownWithMessage", ex.getMessage()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -127,22 +145,6 @@ public class Teleport implements Runnable, ITeleport
|
|||||||
this.ess = ess;
|
this.ess = ess;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void respawn(final Trade chargeFor, TeleportCause cause) throws Exception
|
|
||||||
{
|
|
||||||
final Player player = user.getBase();
|
|
||||||
final Location bed = player.getBedSpawnLocation();
|
|
||||||
final PlayerRespawnEvent pre = new PlayerRespawnEvent(player, bed == null ? player.getWorld().getSpawnLocation() : bed, bed != null);
|
|
||||||
ess.getServer().getPluginManager().callEvent(pre);
|
|
||||||
teleport(new Target(pre.getRespawnLocation()), chargeFor, cause);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void warp(String warp, Trade chargeFor, TeleportCause cause) throws Exception
|
|
||||||
{
|
|
||||||
Location loc = ess.getWarps().getWarp(warp);
|
|
||||||
teleport(new Target(loc), chargeFor, cause);
|
|
||||||
user.sendMessage(_("warpingTo", warp));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void cooldown(boolean check) throws Exception
|
public void cooldown(boolean check) throws Exception
|
||||||
{
|
{
|
||||||
final Calendar time = new GregorianCalendar();
|
final Calendar time = new GregorianCalendar();
|
||||||
@@ -181,6 +183,7 @@ public class Teleport implements Runnable, ITeleport
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//If we need to cancel a pending teleport call this method
|
||||||
public void cancel(boolean notifyUser)
|
public void cancel(boolean notifyUser)
|
||||||
{
|
{
|
||||||
if (teleTimer == -1)
|
if (teleTimer == -1)
|
||||||
@@ -193,6 +196,10 @@ public class Teleport implements Runnable, ITeleport
|
|||||||
if (notifyUser)
|
if (notifyUser)
|
||||||
{
|
{
|
||||||
user.sendMessage(_("pendingTeleportCancelled"));
|
user.sendMessage(_("pendingTeleportCancelled"));
|
||||||
|
if (teleportUser != user)
|
||||||
|
{
|
||||||
|
teleportUser.sendMessage(_("pendingTeleportCancelled"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
@@ -201,16 +208,40 @@ public class Teleport implements Runnable, ITeleport
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void cancel()
|
//The now function is used when you want to skip tp delay when teleporting someone to a location or player.
|
||||||
|
public void now(Location loc, boolean cooldown, TeleportCause cause) throws Exception
|
||||||
|
{
|
||||||
|
if (cooldown)
|
||||||
|
{
|
||||||
|
cooldown(false);
|
||||||
|
}
|
||||||
|
now(new Target(loc), cause);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void now(Player entity, boolean cooldown, TeleportCause cause) throws Exception
|
||||||
|
{
|
||||||
|
if (cooldown)
|
||||||
|
{
|
||||||
|
cooldown(false);
|
||||||
|
}
|
||||||
|
now(new Target(entity), cause);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void now(Target target, TeleportCause cause) throws Exception
|
||||||
{
|
{
|
||||||
cancel(false);
|
cancel(false);
|
||||||
|
user.setLastLocation();
|
||||||
|
user.getBase().teleport(Util.getSafeDestination(target.getLocation()), cause);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//The teleport function is used when you want to normally teleport someone to a location or player.
|
||||||
|
//This method is nolonger used internally and will be removed.
|
||||||
|
@Deprecated
|
||||||
public void teleport(Location loc, Trade chargeFor) throws Exception
|
public void teleport(Location loc, Trade chargeFor) throws Exception
|
||||||
{
|
{
|
||||||
teleport(new Target(loc), chargeFor, TeleportCause.PLUGIN);
|
teleport(loc, chargeFor, TeleportCause.PLUGIN);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void teleport(Location loc, Trade chargeFor, TeleportCause cause) throws Exception
|
public void teleport(Location loc, Trade chargeFor, TeleportCause cause) throws Exception
|
||||||
{
|
{
|
||||||
teleport(new Target(loc), chargeFor, cause);
|
teleport(new Target(loc), chargeFor, cause);
|
||||||
@@ -241,58 +272,82 @@ public class Teleport implements Runnable, ITeleport
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
cancel();
|
cancel(false);
|
||||||
Calendar c = new GregorianCalendar();
|
warnUser(user);
|
||||||
c.add(Calendar.SECOND, (int)delay);
|
|
||||||
c.add(Calendar.MILLISECOND, (int)((delay * 1000.0) % 1000.0));
|
|
||||||
user.sendMessage(_("dontMoveMessage", Util.formatDateDiff(c.getTimeInMillis())));
|
|
||||||
initTimer((long)(delay * 1000.0), target, chargeFor, cause);
|
initTimer((long)(delay * 1000.0), target, chargeFor, cause);
|
||||||
|
|
||||||
teleTimer = ess.scheduleSyncRepeatingTask(this, 10, 10);
|
teleTimer = ess.scheduleSyncRepeatingTask(this, 10, 10);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void now(Target target, TeleportCause cause) throws Exception
|
//The teleportToMe function is a wrapper used to handle teleporting players to them, like /tphere
|
||||||
|
public void teleportToMe(User otherUser, Trade chargeFor, TeleportCause cause) throws Exception
|
||||||
{
|
{
|
||||||
cancel();
|
Target target = new Target(user);
|
||||||
user.setLastLocation();
|
|
||||||
user.getBase().teleport(Util.getSafeDestination(target.getLocation()), cause);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void now(Location loc, boolean cooldown, TeleportCause cause) throws Exception
|
double delay = ess.getSettings().getTeleportDelay();
|
||||||
{
|
|
||||||
if (cooldown)
|
if (chargeFor != null)
|
||||||
|
{
|
||||||
|
chargeFor.isAffordableFor(user);
|
||||||
|
}
|
||||||
|
cooldown(true);
|
||||||
|
if (delay <= 0 || user.isAuthorized("essentials.teleport.timer.bypass"))
|
||||||
{
|
{
|
||||||
cooldown(false);
|
cooldown(false);
|
||||||
|
otherUser.getTeleport().now(target, cause);
|
||||||
|
if (chargeFor != null)
|
||||||
|
{
|
||||||
|
chargeFor.charge(user);
|
||||||
|
}
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
now(new Target(loc), cause);
|
|
||||||
|
cancel(false);
|
||||||
|
warnUser(otherUser);
|
||||||
|
initTimer((long)(delay * 1000.0), otherUser, target, chargeFor, cause);
|
||||||
|
|
||||||
|
teleTimer = ess.scheduleSyncRepeatingTask(this, 10, 10);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void now(Location loc, Trade chargeFor, TeleportCause cause) throws Exception
|
private void warnUser(final IUser user)
|
||||||
{
|
{
|
||||||
cooldown(false);
|
Calendar c = new GregorianCalendar();
|
||||||
chargeFor.charge(user);
|
c.add(Calendar.SECOND, (int)delay);
|
||||||
now(new Target(loc), cause);
|
c.add(Calendar.MILLISECOND, (int)((delay * 1000.0) % 1000.0));
|
||||||
|
user.sendMessage(_("dontMoveMessage", Util.formatDateDiff(c.getTimeInMillis())));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void now(Player entity, boolean cooldown, TeleportCause cause) throws Exception
|
//The respawn function is a wrapper used to handle tp fallback, on /jail and /home
|
||||||
|
public void respawn(final Trade chargeFor, TeleportCause cause) throws Exception
|
||||||
{
|
{
|
||||||
if (cooldown)
|
final Player player = user.getBase();
|
||||||
{
|
final Location bed = player.getBedSpawnLocation();
|
||||||
cooldown(false);
|
final PlayerRespawnEvent pre = new PlayerRespawnEvent(player, bed == null ? player.getWorld().getSpawnLocation() : bed, bed != null);
|
||||||
}
|
ess.getServer().getPluginManager().callEvent(pre);
|
||||||
now(new Target(entity), cause);
|
teleport(new Target(pre.getRespawnLocation()), chargeFor, cause);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//The warp function is a wrapper used to teleport a player to a /warp
|
||||||
|
public void warp(String warp, Trade chargeFor, TeleportCause cause) throws Exception
|
||||||
|
{
|
||||||
|
Location loc = ess.getWarps().getWarp(warp);
|
||||||
|
teleport(new Target(loc), chargeFor, cause);
|
||||||
|
user.sendMessage(_("warpingTo", warp));
|
||||||
|
}
|
||||||
|
|
||||||
|
//The back function is a wrapper used to teleport a player /back to their previous location.
|
||||||
public void back(Trade chargeFor) throws Exception
|
public void back(Trade chargeFor) throws Exception
|
||||||
{
|
{
|
||||||
teleport(new Target(user.getLastLocation()), chargeFor, TeleportCause.COMMAND);
|
teleport(new Target(user.getLastLocation()), chargeFor, TeleportCause.COMMAND);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//This function is used to throw a user back after a jail sentence
|
||||||
public void back() throws Exception
|
public void back() throws Exception
|
||||||
{
|
{
|
||||||
now(new Target(user.getLastLocation()), TeleportCause.COMMAND);
|
now(new Target(user.getLastLocation()), TeleportCause.COMMAND);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//This function handles teleporting to /home
|
||||||
public void home(Location loc, Trade chargeFor) throws Exception
|
public void home(Location loc, Trade chargeFor) throws Exception
|
||||||
{
|
{
|
||||||
teleport(new Target(loc), chargeFor, TeleportCause.COMMAND);
|
teleport(new Target(loc), chargeFor, TeleportCause.COMMAND);
|
||||||
|
@@ -23,10 +23,13 @@ public class Util
|
|||||||
private final static Logger logger = Logger.getLogger("Minecraft");
|
private final static Logger logger = Logger.getLogger("Minecraft");
|
||||||
private final static Pattern INVALIDFILECHARS = Pattern.compile("[^a-z0-9]");
|
private final static Pattern INVALIDFILECHARS = Pattern.compile("[^a-z0-9]");
|
||||||
private final static Pattern INVALIDCHARS = Pattern.compile("[^\t\n\r\u0020-\u007E\u0085\u00A0-\uD7FF\uE000-\uFFFC]");
|
private final static Pattern INVALIDCHARS = Pattern.compile("[^\t\n\r\u0020-\u007E\u0085\u00A0-\uD7FF\uE000-\uFFFC]");
|
||||||
|
private final static Pattern BADFILENAMES = Pattern.compile("^(CON|PRN|AUX|NUL|COM[1-9]|LPT[1-9])(\\.(.+))?$", Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE | Pattern.COMMENTS);
|
||||||
|
|
||||||
public static String sanitizeFileName(final String name)
|
public static String sanitizeFileName(final String name)
|
||||||
{
|
{
|
||||||
final String newName = INVALIDFILECHARS.matcher(name.toLowerCase(Locale.ENGLISH)).replaceAll("_");
|
String newName = INVALIDFILECHARS.matcher(name.toLowerCase(Locale.ENGLISH)).replaceAll("_");
|
||||||
|
if(BADFILENAMES.matcher(newName).matches())
|
||||||
|
newName = "_" + newName;
|
||||||
return newName;
|
return newName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -44,7 +44,7 @@ public class Commandban extends EssentialsCommand
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (user.isAuthorized("essentials.ban.exempt"))
|
if (user.isAuthorized("essentials.ban.exempt") && sender instanceof Player)
|
||||||
{
|
{
|
||||||
sender.sendMessage(_("banExempt"));
|
sender.sendMessage(_("banExempt"));
|
||||||
return;
|
return;
|
||||||
|
@@ -6,6 +6,8 @@ import java.util.List;
|
|||||||
import org.bukkit.Server;
|
import org.bukkit.Server;
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.potion.PotionEffect;
|
||||||
|
import org.bukkit.potion.PotionEffectType;
|
||||||
|
|
||||||
|
|
||||||
public class Commandheal extends EssentialsCommand
|
public class Commandheal extends EssentialsCommand
|
||||||
@@ -33,9 +35,7 @@ public class Commandheal extends EssentialsCommand
|
|||||||
{
|
{
|
||||||
user.healCooldown();
|
user.healCooldown();
|
||||||
}
|
}
|
||||||
user.setHealth(20);
|
healPlayer(user);
|
||||||
user.setFoodLevel(20);
|
|
||||||
user.sendMessage(_("heal"));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -63,10 +63,19 @@ public class Commandheal extends EssentialsCommand
|
|||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
p.setHealth(20);
|
healPlayer(p);
|
||||||
p.setFoodLevel(20);
|
|
||||||
p.sendMessage(_("heal"));
|
|
||||||
sender.sendMessage(_("healOther", p.getDisplayName()));
|
sender.sendMessage(_("healOther", p.getDisplayName()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void healPlayer(final Player p)
|
||||||
|
{
|
||||||
|
p.setHealth(20);
|
||||||
|
p.setFoodLevel(20);
|
||||||
|
p.sendMessage(_("heal"));
|
||||||
|
for (PotionEffect effect : p.getActivePotionEffects())
|
||||||
|
{
|
||||||
|
p.removePotionEffect(effect.getType());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -2,7 +2,9 @@ package com.earth2me.essentials.commands;
|
|||||||
|
|
||||||
import static com.earth2me.essentials.I18n._;
|
import static com.earth2me.essentials.I18n._;
|
||||||
import com.earth2me.essentials.User;
|
import com.earth2me.essentials.User;
|
||||||
|
import com.earth2me.essentials.Util;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.Server;
|
import org.bukkit.Server;
|
||||||
|
|
||||||
@@ -55,9 +57,10 @@ public class Commandsethome extends EssentialsCommand
|
|||||||
{
|
{
|
||||||
name = "home";
|
name = "home";
|
||||||
}
|
}
|
||||||
if ("bed".equals(name))
|
if ("bed".equals(name) || Util.isInt(name))
|
||||||
{
|
{
|
||||||
throw new NotEnoughArgumentsException();
|
user.sendMessage(_("invalidHomeName"));
|
||||||
|
throw new NoChargeException();
|
||||||
}
|
}
|
||||||
usersHome.setHome(name, location);
|
usersHome.setHome(name, location);
|
||||||
user.sendMessage(_("homeSet", user.getLocation().getWorld().getName(), user.getLocation().getBlockX(), user.getLocation().getBlockY(), user.getLocation().getBlockZ()));
|
user.sendMessage(_("homeSet", user.getLocation().getWorld().getName(), user.getLocation().getBlockX(), user.getLocation().getBlockY(), user.getLocation().getBlockZ()));
|
||||||
|
@@ -7,6 +7,7 @@ import java.util.logging.Logger;
|
|||||||
import org.bukkit.Server;
|
import org.bukkit.Server;
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
import org.bukkit.command.PluginCommand;
|
import org.bukkit.command.PluginCommand;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
|
||||||
public class Commandsudo extends EssentialsCommand
|
public class Commandsudo extends EssentialsCommand
|
||||||
@@ -26,6 +27,15 @@ public class Commandsudo extends EssentialsCommand
|
|||||||
}
|
}
|
||||||
|
|
||||||
final User user = getPlayer(server, args, 0, false);
|
final User user = getPlayer(server, args, 0, false);
|
||||||
|
if(args[1].equalsIgnoreCase("say"))
|
||||||
|
{
|
||||||
|
if (user.isAuthorized("essentials.sudo.exempt"))
|
||||||
|
{
|
||||||
|
throw new Exception(_("sudoExempt"));
|
||||||
|
}
|
||||||
|
user.chat(getFinalArg(args, 2));
|
||||||
|
return;
|
||||||
|
}
|
||||||
final String command = args[1];
|
final String command = args[1];
|
||||||
final String[] arguments = new String[args.length - 2];
|
final String[] arguments = new String[args.length - 2];
|
||||||
if (arguments.length > 0)
|
if (arguments.length > 0)
|
||||||
@@ -33,7 +43,7 @@ public class Commandsudo extends EssentialsCommand
|
|||||||
System.arraycopy(args, 2, arguments, 0, args.length - 2);
|
System.arraycopy(args, 2, arguments, 0, args.length - 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (user.isAuthorized("essentials.sudo.exempt"))
|
if (user.isAuthorized("essentials.sudo.exempt") && sender instanceof Player)
|
||||||
{
|
{
|
||||||
throw new Exception(_("sudoExempt"));
|
throw new Exception(_("sudoExempt"));
|
||||||
}
|
}
|
||||||
|
@@ -65,12 +65,13 @@ public class Commandtpaccept extends EssentialsCommand
|
|||||||
|
|
||||||
if (user.isTpRequestHere())
|
if (user.isTpRequestHere())
|
||||||
{
|
{
|
||||||
user.getTeleport().teleport(target, charge, TeleportCause.COMMAND);
|
target.getTeleport().teleportToMe(user, charge, TeleportCause.COMMAND);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
target.getTeleport().teleport(user, charge, TeleportCause.COMMAND);
|
target.getTeleport().teleport(user, charge, TeleportCause.COMMAND);
|
||||||
}
|
}
|
||||||
user.requestTeleport(null, false);
|
user.requestTeleport(null, false);
|
||||||
|
throw new NoChargeException();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -27,7 +27,7 @@ public class Commandtphere extends EssentialsCommand
|
|||||||
{
|
{
|
||||||
throw new Exception(_("noPerm", "essentials.worlds." + user.getWorld().getName()));
|
throw new Exception(_("noPerm", "essentials.worlds." + user.getWorld().getName()));
|
||||||
}
|
}
|
||||||
player.getTeleport().teleport(user, new Trade(this.getName(), ess), TeleportCause.COMMAND);
|
user.getTeleport().teleportToMe(player, new Trade(this.getName(), ess), TeleportCause.COMMAND);
|
||||||
user.sendMessage(_("teleporting"));
|
user.sendMessage(_("teleporting"));
|
||||||
player.sendMessage(_("teleporting"));
|
player.sendMessage(_("teleporting"));
|
||||||
throw new NoChargeException();
|
throw new NoChargeException();
|
||||||
|
@@ -31,29 +31,26 @@ public class SuperpermsHandler implements IPermissionsHandler
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean hasPermission(final Player base, final String node)
|
public boolean hasPermission(final Player base, String node)
|
||||||
{
|
{
|
||||||
if (base.hasPermission("*"))
|
String permCheck = node;
|
||||||
|
int index;
|
||||||
|
while (true)
|
||||||
{
|
{
|
||||||
return true;
|
if (base.isPermissionSet(permCheck))
|
||||||
}
|
|
||||||
if (base.hasPermission("-" + node))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
final String[] parts = node.split("\\.");
|
|
||||||
final StringBuilder builder = new StringBuilder(node.length());
|
|
||||||
for (String part : parts)
|
|
||||||
{
|
|
||||||
builder.append('*');
|
|
||||||
if (base.hasPermission(builder.toString()))
|
|
||||||
{
|
{
|
||||||
return true;
|
return base.hasPermission(permCheck);
|
||||||
}
|
}
|
||||||
builder.deleteCharAt(builder.length() - 1);
|
|
||||||
builder.append(part).append('.');
|
index = node.lastIndexOf('.');
|
||||||
|
if (index < 1)
|
||||||
|
{
|
||||||
|
return base.hasPermission("*");
|
||||||
|
}
|
||||||
|
|
||||||
|
node = node.substring(0, index);
|
||||||
|
permCheck = node + ".*";
|
||||||
}
|
}
|
||||||
return base.hasPermission(node);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@@ -51,7 +51,7 @@ public class SignKit extends EssentialsSign
|
|||||||
final String kitName = sign.getLine(1).toLowerCase(Locale.ENGLISH).trim();
|
final String kitName = sign.getLine(1).toLowerCase(Locale.ENGLISH).trim();
|
||||||
final String group = sign.getLine(2);
|
final String group = sign.getLine(2);
|
||||||
if ((!group.isEmpty() && ("§2Everyone".equals(group) || player.inGroup(group)))
|
if ((!group.isEmpty() && ("§2Everyone".equals(group) || player.inGroup(group)))
|
||||||
|| (group.isEmpty() && (player.isAuthorized("essentials.kit." + kitName))))
|
|| (group.isEmpty() && (player.isAuthorized("essentials.kits." + kitName))))
|
||||||
{
|
{
|
||||||
final Trade charge = getTrade(sign, 3, ess);
|
final Trade charge = getTrade(sign, 3, ess);
|
||||||
charge.isAffordableFor(player);
|
charge.isAffordableFor(player);
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
package com.earth2me.essentials.signs;
|
package com.earth2me.essentials.signs;
|
||||||
|
|
||||||
import com.earth2me.essentials.ChargeException;
|
import com.earth2me.essentials.ChargeException;
|
||||||
|
import static com.earth2me.essentials.I18n._;
|
||||||
import com.earth2me.essentials.IEssentials;
|
import com.earth2me.essentials.IEssentials;
|
||||||
import com.earth2me.essentials.Trade;
|
import com.earth2me.essentials.Trade;
|
||||||
import com.earth2me.essentials.User;
|
import com.earth2me.essentials.User;
|
||||||
@@ -17,15 +18,13 @@ public class SignWarp extends EssentialsSign
|
|||||||
@Override
|
@Override
|
||||||
protected boolean onSignCreate(final ISign sign, final User player, final String username, final IEssentials ess) throws SignException
|
protected boolean onSignCreate(final ISign sign, final User player, final String username, final IEssentials ess) throws SignException
|
||||||
{
|
{
|
||||||
ess.getLogger().info("triggered warp sign create");
|
|
||||||
validateTrade(sign, 3, ess);
|
validateTrade(sign, 3, ess);
|
||||||
final String warpName = sign.getLine(1);
|
final String warpName = sign.getLine(1);
|
||||||
|
|
||||||
if (warpName.isEmpty())
|
if (warpName.isEmpty())
|
||||||
{
|
{
|
||||||
ess.getLogger().info("trying to change sign to show error");
|
|
||||||
sign.setLine(1, "§c<Warp name>");
|
sign.setLine(1, "§c<Warp name>");
|
||||||
return false;
|
throw new SignException(_("invalidSignLine", 1));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -54,7 +53,7 @@ public class SignWarp extends EssentialsSign
|
|||||||
if ((!group.isEmpty()
|
if ((!group.isEmpty()
|
||||||
&& ("§2Everyone".equals(group)
|
&& ("§2Everyone".equals(group)
|
||||||
|| player.inGroup(group)))
|
|| player.inGroup(group)))
|
||||||
|| (group.isEmpty() && (!ess.getSettings().getPerWarpPermission() || player.isAuthorized("essentials.warp." + warpName))))
|
|| (group.isEmpty() && (!ess.getSettings().getPerWarpPermission() || player.isAuthorized("essentials.warps." + warpName))))
|
||||||
{
|
{
|
||||||
final Trade charge = getTrade(sign, 3, ess);
|
final Trade charge = getTrade(sign, 3, ess);
|
||||||
try
|
try
|
||||||
|
@@ -8,7 +8,7 @@
|
|||||||
# If you receive an error when Essentials loads, ensure that:
|
# If you receive an error when Essentials loads, ensure that:
|
||||||
# - No tabs are present: YAML only allows spaces
|
# - No tabs are present: YAML only allows spaces
|
||||||
# - Indents are correct: YAML hierarchy is based entirely on indentation
|
# - Indents are correct: YAML hierarchy is based entirely on indentation
|
||||||
# - You have "escaped" all apostrophes in your text: If you want to write "don't", for example, write "don''t" instead (note the doubled apostrphe)
|
# - You have "escaped" all apostrophes in your text: If you want to write "don't", for example, write "don''t" instead (note the doubled apostrophe)
|
||||||
# - Text with symbols is enclosed in single or double quotation marks
|
# - Text with symbols is enclosed in single or double quotation marks
|
||||||
|
|
||||||
# If you have problems join the Essentials help support channel: http://tiny.cc/EssentialsChat
|
# If you have problems join the Essentials help support channel: http://tiny.cc/EssentialsChat
|
||||||
@@ -246,7 +246,7 @@ debug: false
|
|||||||
|
|
||||||
# Set the locale for all messages
|
# Set the locale for all messages
|
||||||
# If you don't set this, the default locale of the server will be used.
|
# If you don't set this, the default locale of the server will be used.
|
||||||
# Don't forget to remove the # infront of the line
|
# Don't forget to remove the # in front of the line
|
||||||
#locale: de_DE
|
#locale: de_DE
|
||||||
|
|
||||||
# Turn off god mode when people exit
|
# Turn off god mode when people exit
|
||||||
@@ -277,7 +277,7 @@ disable-item-pickup-while-afk: false
|
|||||||
# Disable this to reduce server lag.
|
# Disable this to reduce server lag.
|
||||||
cancel-afk-on-move: true
|
cancel-afk-on-move: true
|
||||||
|
|
||||||
# You can disable the death messages of minecraft here
|
# You can disable the death messages of Minecraft here
|
||||||
death-messages: true
|
death-messages: true
|
||||||
|
|
||||||
# Add worlds to this list, if you want to automatically disable god mode there
|
# Add worlds to this list, if you want to automatically disable god mode there
|
||||||
@@ -287,17 +287,17 @@ no-god-in-worlds:
|
|||||||
# Set to true to enable per-world permissions for teleporting between worlds with essentials commands
|
# Set to true to enable per-world permissions for teleporting between worlds with essentials commands
|
||||||
# This applies to /world, /back, /tp[a|o][here|all], but not warps.
|
# This applies to /world, /back, /tp[a|o][here|all], but not warps.
|
||||||
# Give someone permission to teleport to a world with essentials.worlds.<worldname>
|
# Give someone permission to teleport to a world with essentials.worlds.<worldname>
|
||||||
# This does not effect the /home command, there is a seperate toggle below for this.
|
# This does not effect the /home command, there is a separate toggle below for this.
|
||||||
world-teleport-permissions: false
|
world-teleport-permissions: false
|
||||||
|
|
||||||
# The number of items given if the quantity parameter is left out in /item or /give.
|
# The number of items given if the quantity parameter is left out in /item or /give.
|
||||||
# If this number is below 1, the maximum stack size size is given. If oversized stacks
|
# If this number is below 1, the maximum stack size size is given. If over-sized stacks
|
||||||
# is not enabled, any number higher then the maximum stack size results in more than one stack.
|
# are not enabled, any number higher then the maximum stack size results in more than one stack.
|
||||||
default-stack-size: -1
|
default-stack-size: -1
|
||||||
|
|
||||||
# Oversized stacks are stacks that ignore the normal max stacksize.
|
# Over-sized stacks are stacks that ignore the normal max stack size.
|
||||||
# They can be obtained using /give and /item, if the player has essentials.oversizedstacks permission.
|
# They can be obtained using /give and /item, if the player has essentials.oversizedstacks permission.
|
||||||
# How many items should be in an oversized stack?
|
# How many items should be in an over-sized stack?
|
||||||
oversized-stacksize: 64
|
oversized-stacksize: 64
|
||||||
|
|
||||||
# Allow repair of enchanted weapons and armor.
|
# Allow repair of enchanted weapons and armor.
|
||||||
@@ -357,7 +357,7 @@ starting-balance: 0
|
|||||||
# These are now defined in worth.yml
|
# These are now defined in worth.yml
|
||||||
|
|
||||||
# Defines the cost to use the given commands PER USE
|
# Defines the cost to use the given commands PER USE
|
||||||
# Some commands like /repair have subcosts, check the wiki for more information.
|
# Some commands like /repair have sub-costs, check the wiki for more information.
|
||||||
command-costs:
|
command-costs:
|
||||||
# /example costs $1000 PER USE
|
# /example costs $1000 PER USE
|
||||||
#example: 1000
|
#example: 1000
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
#version: teamcity
|
#version: TeamCity
|
||||||
#If you change this file, it will not be automatically updated after the next release,
|
#If you change this file, it will not be automatically updated after the next release,
|
||||||
#item,id,metadata
|
#item,id,metadata
|
||||||
stone,1,0
|
stone,1,0
|
||||||
@@ -1329,7 +1329,6 @@ burningfurnace,62,0
|
|||||||
bfurnace,62,0
|
bfurnace,62,0
|
||||||
signpost,63,0
|
signpost,63,0
|
||||||
spost,63,0
|
spost,63,0
|
||||||
door,64,0
|
|
||||||
woodendoorhalf,64,0
|
woodendoorhalf,64,0
|
||||||
wooddoorhalf,64,0
|
wooddoorhalf,64,0
|
||||||
wdoorhalf,64,0
|
wdoorhalf,64,0
|
||||||
@@ -1588,7 +1587,9 @@ tdoor,96,0
|
|||||||
doort,96,0
|
doort,96,0
|
||||||
trapd,96,0
|
trapd,96,0
|
||||||
dtrap,96,0
|
dtrap,96,0
|
||||||
|
monsteregg,97,0
|
||||||
silverfish,97,0
|
silverfish,97,0
|
||||||
|
monsteregg,97,0
|
||||||
monstereggsmoothstone,97,0
|
monstereggsmoothstone,97,0
|
||||||
monstereggsstone,97,0
|
monstereggsstone,97,0
|
||||||
meggsmoothstone,97,0
|
meggsmoothstone,97,0
|
||||||
@@ -3397,6 +3398,7 @@ sign,323,0
|
|||||||
woodendoor,324,0
|
woodendoor,324,0
|
||||||
wooddoor,324,0
|
wooddoor,324,0
|
||||||
wdoor,324,0
|
wdoor,324,0
|
||||||
|
door,324,0
|
||||||
bucket,325,0
|
bucket,325,0
|
||||||
bukkit,325,0
|
bukkit,325,0
|
||||||
waterbucket,326,0
|
waterbucket,326,0
|
||||||
@@ -3946,14 +3948,98 @@ waterbottle,373,0
|
|||||||
fullbottle,373,0
|
fullbottle,373,0
|
||||||
watervase,373,0
|
watervase,373,0
|
||||||
fullvase,373,0
|
fullvase,373,0
|
||||||
|
clearpotion,373,6
|
||||||
|
clearpot,373,6
|
||||||
|
clearextendedpotion,373,7
|
||||||
|
clearexpotion,373,7
|
||||||
|
clear2potion,373,7
|
||||||
|
clearextendedpot,373,7
|
||||||
|
clearexpot,373,7
|
||||||
|
clear2pot,373,7
|
||||||
|
diffusepotion,373,11
|
||||||
|
diffusepot,373,11
|
||||||
|
artlesspotion,373,13
|
||||||
|
artlesspot,373,13
|
||||||
|
thinpotion,373,14
|
||||||
|
thinpot,373,14
|
||||||
|
thinextendedpotion,373,15
|
||||||
|
thinexpotion,373,15
|
||||||
|
thin2potion,373,15
|
||||||
|
thinextendedpot,373,15
|
||||||
|
thinexpot,373,15
|
||||||
|
thin2pot,373,15
|
||||||
awkwardpotion,373,16
|
awkwardpotion,373,16
|
||||||
awkwardpot,373,16
|
awkwardpot,373,16
|
||||||
|
bunglingpotion,373,22
|
||||||
|
bunglingpot,373,22
|
||||||
|
bunglingextendedpotion,373,23
|
||||||
|
bunglingexpotion,373,23
|
||||||
|
bungling2potion,373,23
|
||||||
|
bunglingextendedpot,373,23
|
||||||
|
bunglingexpot,373,23
|
||||||
|
bungling2pot,373,23
|
||||||
|
smoothpotion,373,27
|
||||||
|
smoothpot,373,27
|
||||||
|
suavepotion,373,29
|
||||||
|
suavepot,373,29
|
||||||
|
debonairpotion,373,30
|
||||||
|
debonairpot,373,30
|
||||||
|
debonairextendedpotion,373,31
|
||||||
|
debonairexpotion,373,31
|
||||||
|
debonair2potion,373,31
|
||||||
|
debonairextendedpot,373,31
|
||||||
|
debonairexpot,373,31
|
||||||
|
debonair2pot,373,31
|
||||||
thickpotion,373,32
|
thickpotion,373,32
|
||||||
thickpot,373,32
|
thickpot,373,32
|
||||||
mundaneexpotion,373,64
|
charmingpotion,373,38
|
||||||
|
charmingpot,373,38
|
||||||
|
charmingextendedpotion,373,39
|
||||||
|
charmingexpotion,373,39
|
||||||
|
charming2potion,373,39
|
||||||
|
charmingextendedpot,373,39
|
||||||
|
charmingexpot,373,39
|
||||||
|
charming2pot,373,39
|
||||||
|
refinedpotion,373,43
|
||||||
|
refinedpot,373,43
|
||||||
|
cordialpotion,373,45
|
||||||
|
cordialpot,373,45
|
||||||
|
sparklingpotion,373,46
|
||||||
|
sparklingpot,373,46
|
||||||
|
sparklingextendedpotion,373,47
|
||||||
|
sparklingexpotion,373,47
|
||||||
|
sparkling2potion,373,47
|
||||||
|
sparklingextendedpot,373,47
|
||||||
|
sparklingexpot,373,47
|
||||||
|
sparkling2pot,373,47
|
||||||
|
potentpotion,373,48
|
||||||
|
potentpot,373,48
|
||||||
|
rankpotion,373,54
|
||||||
|
rankpot,373,54
|
||||||
|
rankextendedpotion,373,55
|
||||||
|
rankexpotion,373,55
|
||||||
|
rank2potion,373,55
|
||||||
|
rankextendedpot,373,55
|
||||||
|
rankexpot,373,55
|
||||||
|
rank2pot,373,55
|
||||||
|
acridpotion,373,59
|
||||||
|
acridpot,373,59
|
||||||
|
grosspotion,373,61
|
||||||
|
grosspot,373,61
|
||||||
|
stinkypotion,373,62
|
||||||
|
stinkypot,373,62
|
||||||
|
stinkyextendedpotion,373,63
|
||||||
|
stinkyexpotion,373,63
|
||||||
|
stinky2potion,373,63
|
||||||
|
stinkyextendedpot,373,63
|
||||||
|
stinkyexpot,373,63
|
||||||
|
stinky2pot,373,63
|
||||||
mundaneextendedpotion,373,64
|
mundaneextendedpotion,373,64
|
||||||
mundaneexpot,373,64
|
mundaneexpotion,373,64
|
||||||
|
mundane2potion,373,64
|
||||||
mundaneextendedpot,373,64
|
mundaneextendedpot,373,64
|
||||||
|
mundaneexpot,373,64
|
||||||
|
mundane2pot,373,64
|
||||||
mundanepotion,373,8192
|
mundanepotion,373,8192
|
||||||
mundanepot,373,8192
|
mundanepot,373,8192
|
||||||
regenerationpotion,373,8193
|
regenerationpotion,373,8193
|
||||||
@@ -4308,6 +4394,22 @@ splhealingpot,373,16389
|
|||||||
splhealpot,373,16389
|
splhealpot,373,16389
|
||||||
spllifepot,373,16389
|
spllifepot,373,16389
|
||||||
sphpot,373,16389
|
sphpot,373,16389
|
||||||
|
splashclearpotion,373,16390
|
||||||
|
splashclearpot,373,16390
|
||||||
|
splclearpotion,373,16390
|
||||||
|
splclearpot,373,16390
|
||||||
|
splashclearextendedpotion,373,16391
|
||||||
|
splashclearexpotion,373,16391
|
||||||
|
splashclear2potion,373,16391
|
||||||
|
splashclearextendedpot,373,16391
|
||||||
|
splashclearexpot,373,16391
|
||||||
|
splashclear2pot,373,16391
|
||||||
|
splclearextendedpotion,373,16391
|
||||||
|
splclearexpotion,373,16391
|
||||||
|
splclear2potion,373,16391
|
||||||
|
splclearextendedpot,373,16391
|
||||||
|
splclearexpot,373,16391
|
||||||
|
splclear2pot,373,16391
|
||||||
splashweaknesspotion,373,16392
|
splashweaknesspotion,373,16392
|
||||||
splashweakpotion,373,16392
|
splashweakpotion,373,16392
|
||||||
splashweaknesspot,373,16392
|
splashweaknesspot,373,16392
|
||||||
@@ -4339,6 +4441,10 @@ splslowpotion,373,16394
|
|||||||
splslownesspot,373,16394
|
splslownesspot,373,16394
|
||||||
splslowpot,373,16394
|
splslowpot,373,16394
|
||||||
spslpot,373,16394
|
spslpot,373,16394
|
||||||
|
splashdiffusepotion,373,16395
|
||||||
|
splashdiffusepot,373,16395
|
||||||
|
spldiffusepotion,373,16395
|
||||||
|
spldiffusepot,373,16395
|
||||||
splashharmingpotion,373,16396
|
splashharmingpotion,373,16396
|
||||||
splashdamagepotion,373,16396
|
splashdamagepotion,373,16396
|
||||||
splashdmgpotion,373,16396
|
splashdmgpotion,373,16396
|
||||||
@@ -4352,6 +4458,74 @@ splharmingpot,373,16396
|
|||||||
spldamagepot,373,16396
|
spldamagepot,373,16396
|
||||||
spldmgpot,373,16396
|
spldmgpot,373,16396
|
||||||
spdpot,373,16396
|
spdpot,373,16396
|
||||||
|
splashartlesspotion,373,16397
|
||||||
|
splashartlesspot,373,16397
|
||||||
|
splartlesspotion,373,16397
|
||||||
|
splartlesspot,373,16397
|
||||||
|
splashthinpotion,373,16398
|
||||||
|
splashthinpot,373,16398
|
||||||
|
splthinpotion,373,16398
|
||||||
|
splthinpot,373,16398
|
||||||
|
splashthinextendedpotion,373,16399
|
||||||
|
splashthinexpotion,373,16399
|
||||||
|
splashthin2potion,373,16399
|
||||||
|
splashthinextendedpot,373,16399
|
||||||
|
splashthinexpot,373,16399
|
||||||
|
splashthin2pot,373,16399
|
||||||
|
splthinextendedpotion,373,16399
|
||||||
|
splthinexpotion,373,16399
|
||||||
|
splthin2potion,373,16399
|
||||||
|
splthinextendedpot,373,16399
|
||||||
|
splthinexpot,373,16399
|
||||||
|
splthin2pot,373,16399
|
||||||
|
splashawkwardpotion,373,16400
|
||||||
|
splashawkwardpot,373,16400
|
||||||
|
splawkwardpotion,373,16400
|
||||||
|
splawkwardpot,373,16400
|
||||||
|
splashbunglingpotion,373,16406
|
||||||
|
splashbunglingpot,373,16406
|
||||||
|
splbunglingpotion,373,16406
|
||||||
|
splbunglingpot,373,16406
|
||||||
|
splashbunglingextendedpotion,373,16407
|
||||||
|
splashbunglingexpotion,373,16407
|
||||||
|
splashbungling2potion,373,16407
|
||||||
|
splashbunglingextendedpot,373,16407
|
||||||
|
splashbunglingexpot,373,16407
|
||||||
|
splashbungling2pot,373,16407
|
||||||
|
splbunglingextendedpotion,373,16407
|
||||||
|
splbunglingexpotion,373,16407
|
||||||
|
splbungling2potion,373,16407
|
||||||
|
splbunglingextendedpot,373,16407
|
||||||
|
splbunglingexpot,373,16407
|
||||||
|
splbungling2pot,373,16407
|
||||||
|
splashsmoothpotion,373,16411
|
||||||
|
splashsmoothpot,373,16411
|
||||||
|
splsmoothpotion,373,16411
|
||||||
|
splsmoothpot,373,16411
|
||||||
|
splashsuavepotion,373,16413
|
||||||
|
splashsuavepot,373,16413
|
||||||
|
splsuavepotion,373,16413
|
||||||
|
splsuavepot,373,16413
|
||||||
|
splashdebonairpotion,373,16414
|
||||||
|
splashdebonairpot,373,16414
|
||||||
|
spldebonairpotion,373,16414
|
||||||
|
spldebonairpot,373,16414
|
||||||
|
splashdebonairextendedpotion,373,16415
|
||||||
|
splashdebonairexpotion,373,16415
|
||||||
|
splashdebonair2potion,373,16415
|
||||||
|
splashdebonairextendedpot,373,16415
|
||||||
|
splashdebonairexpot,373,16415
|
||||||
|
splashdebonair2pot,373,16415
|
||||||
|
spldebonairextendedpotion,373,16415
|
||||||
|
spldebonairexpotion,373,16415
|
||||||
|
spldebonair2potion,373,16415
|
||||||
|
spldebonairextendedpot,373,16415
|
||||||
|
spldebonairexpot,373,16415
|
||||||
|
spldebonair2pot,373,16415
|
||||||
|
splashthickpotion,373,16416
|
||||||
|
splashthickpot,373,16416
|
||||||
|
splthickpotion,373,16416
|
||||||
|
splthickpot,373,16416
|
||||||
splashregenerationleveliipotion,373,16417
|
splashregenerationleveliipotion,373,16417
|
||||||
splashregenerateleveliipotion,373,16417
|
splashregenerateleveliipotion,373,16417
|
||||||
splashregenleveliipotion,373,16417
|
splashregenleveliipotion,373,16417
|
||||||
@@ -4476,6 +4650,22 @@ splheallevel2pot,373,16421
|
|||||||
splhealingiipot,373,16421
|
splhealingiipot,373,16421
|
||||||
splhealiipot,373,16421
|
splhealiipot,373,16421
|
||||||
sph2pot,373,16421
|
sph2pot,373,16421
|
||||||
|
splashcharmingpotion,373,16422
|
||||||
|
splashcharmingpot,373,16422
|
||||||
|
splcharmingpotion,373,16422
|
||||||
|
splcharmingpot,373,16422
|
||||||
|
splashcharmingextendedpotion,373,16423
|
||||||
|
splashcharmingexpotion,373,16423
|
||||||
|
splashcharming2potion,373,16423
|
||||||
|
splashcharmingextendedpot,373,16423
|
||||||
|
splashcharmingexpot,373,16423
|
||||||
|
splashcharming2pot,373,16423
|
||||||
|
splcharmingextendedpotion,373,16423
|
||||||
|
splcharmingexpotion,373,16423
|
||||||
|
splcharming2potion,373,16423
|
||||||
|
splcharmingextendedpot,373,16423
|
||||||
|
splcharmingexpot,373,16423
|
||||||
|
splcharming2pot,373,16423
|
||||||
splashstrengthleveliipotion,373,16425
|
splashstrengthleveliipotion,373,16425
|
||||||
splashstrongleveliipotion,373,16425
|
splashstrongleveliipotion,373,16425
|
||||||
splashstrleveliipotion,373,16425
|
splashstrleveliipotion,373,16425
|
||||||
@@ -4513,6 +4703,10 @@ splstrengthiipot,373,16425
|
|||||||
splstrongiipot,373,16425
|
splstrongiipot,373,16425
|
||||||
splstriipot,373,16425
|
splstriipot,373,16425
|
||||||
spst2pot,373,16425
|
spst2pot,373,16425
|
||||||
|
splashrefinedpotion,373,16427
|
||||||
|
splashrefinedpot,373,16427
|
||||||
|
splrefinedpotion,373,16427
|
||||||
|
splrefinedpot,373,16427
|
||||||
splashharmingleveliipotion,373,16428
|
splashharmingleveliipotion,373,16428
|
||||||
splashdamageleveliipotion,373,16428
|
splashdamageleveliipotion,373,16428
|
||||||
splashdmgleveliipotion,373,16428
|
splashdmgleveliipotion,373,16428
|
||||||
@@ -4550,6 +4744,82 @@ splharmingiipot,373,16428
|
|||||||
spldamageiipot,373,16428
|
spldamageiipot,373,16428
|
||||||
spldmgiipot,373,16428
|
spldmgiipot,373,16428
|
||||||
spd2pot,373,16428
|
spd2pot,373,16428
|
||||||
|
splashcordialpotion,373,16429
|
||||||
|
splashcordialpot,373,16429
|
||||||
|
splcordialpotion,373,16429
|
||||||
|
splcordialpot,373,16429
|
||||||
|
splashsparklingpotion,373,16430
|
||||||
|
splashsparklingpot,373,16430
|
||||||
|
splsparklingpotion,373,16430
|
||||||
|
splsparklingpot,373,16430
|
||||||
|
splashsparklingextendedpotion,373,16431
|
||||||
|
splashsparklingexpotion,373,16431
|
||||||
|
splashsparkling2potion,373,16431
|
||||||
|
splashsparklingextendedpot,373,16431
|
||||||
|
splashsparklingexpot,373,16431
|
||||||
|
splashsparkling2pot,373,16431
|
||||||
|
splsparklingextendedpotion,373,16431
|
||||||
|
splsparklingexpotion,373,16431
|
||||||
|
splsparkling2potion,373,16431
|
||||||
|
splsparklingextendedpot,373,16431
|
||||||
|
splsparklingexpot,373,16431
|
||||||
|
splsparkling2pot,373,16431
|
||||||
|
splashpotentpotion,373,16432
|
||||||
|
splashpotentpot,373,16432
|
||||||
|
splpotentpotion,373,16432
|
||||||
|
splpotentpot,373,16432
|
||||||
|
splashrankpotion,373,16438
|
||||||
|
splashrankpot,373,16438
|
||||||
|
splrankpotion,373,16438
|
||||||
|
splrankpot,373,16438
|
||||||
|
splashrankextendedpotion,373,16439
|
||||||
|
splashrankexpotion,373,16439
|
||||||
|
splashrank2potion,373,16439
|
||||||
|
splashrankextendedpot,373,16439
|
||||||
|
splashrankexpot,373,16439
|
||||||
|
splashrank2pot,373,16439
|
||||||
|
splrankextendedpotion,373,16439
|
||||||
|
splrankexpotion,373,16439
|
||||||
|
splrank2potion,373,16439
|
||||||
|
splrankextendedpot,373,16439
|
||||||
|
splrankexpot,373,16439
|
||||||
|
splrank2pot,373,16439
|
||||||
|
splashacridpotion,373,16443
|
||||||
|
splashacridpot,373,16443
|
||||||
|
splacridpotion,373,16443
|
||||||
|
splacridpot,373,16443
|
||||||
|
splashgrosspotion,373,16445
|
||||||
|
splashgrosspot,373,16445
|
||||||
|
splgrosspotion,373,16445
|
||||||
|
splgrosspot,373,16445
|
||||||
|
splashstinkypotion,373,16446
|
||||||
|
splashstinkypot,373,16446
|
||||||
|
splstinkypotion,373,16446
|
||||||
|
splstinkypot,373,16446
|
||||||
|
splashstinkyextendedpotion,373,16447
|
||||||
|
splashstinkyexpotion,373,16447
|
||||||
|
splashstinky2potion,373,16447
|
||||||
|
splashstinkyextendedpot,373,16447
|
||||||
|
splashstinkyexpot,373,16447
|
||||||
|
splashstinky2pot,373,16447
|
||||||
|
splstinkyextendedpotion,373,16447
|
||||||
|
splstinkyexpotion,373,16447
|
||||||
|
splstinky2potion,373,16447
|
||||||
|
splstinkyextendedpot,373,16447
|
||||||
|
splstinkyexpot,373,16447
|
||||||
|
splstinky2pot,373,16447
|
||||||
|
splashmundaneextendedpotion,373,16448
|
||||||
|
splashmundaneexpotion,373,16448
|
||||||
|
splashmundane2potion,373,16448
|
||||||
|
splashmundaneextendedpot,373,16448
|
||||||
|
splashmundaneexpot,373,16448
|
||||||
|
splashmundane2pot,373,16448
|
||||||
|
splmundaneextendedpotion,373,16448
|
||||||
|
splmundaneexpotion,373,16448
|
||||||
|
splmundane2potion,373,16448
|
||||||
|
splmundaneextendedpot,373,16448
|
||||||
|
splmundaneexpot,373,16448
|
||||||
|
splmundane2pot,373,16448
|
||||||
splashregenerationextendedpotion,373,16449
|
splashregenerationextendedpotion,373,16449
|
||||||
splashregenerateextendedpotion,373,16449
|
splashregenerateextendedpotion,373,16449
|
||||||
splashregenextendepotion,373,16449
|
splashregenextendepotion,373,16449
|
||||||
|
|
@@ -457,3 +457,4 @@ uptime=\u00a76Uptime:\u00a7c {0}
|
|||||||
antiBuildCraft=\u00a74You are not permitted to create\u00a7c {0}\u00a74.
|
antiBuildCraft=\u00a74You are not permitted to create\u00a7c {0}\u00a74.
|
||||||
antiBuildDrop=\u00a74You are not permitted to drop\u00a7c {0}\u00a74.
|
antiBuildDrop=\u00a74You are not permitted to drop\u00a7c {0}\u00a74.
|
||||||
gcWorld=\u00a76{0} "\u00a7c{1}\u00a76": \u00a7c{2}\u00a76 chunks, \u00a7c{3}\u00a76 entities
|
gcWorld=\u00a76{0} "\u00a7c{1}\u00a76": \u00a7c{2}\u00a76 chunks, \u00a7c{3}\u00a76 entities
|
||||||
|
invalidHomeName=\u00a74Invalid home name
|
||||||
|
@@ -460,3 +460,4 @@ uptime=\u00a76Uptime:\u00a7c {0}
|
|||||||
antiBuildCraft=\u00a74You are not permitted to create\u00a7c {0}\u00a74.
|
antiBuildCraft=\u00a74You are not permitted to create\u00a7c {0}\u00a74.
|
||||||
antiBuildDrop=\u00a74You are not permitted to drop\u00a7c {0}\u00a74.
|
antiBuildDrop=\u00a74You are not permitted to drop\u00a7c {0}\u00a74.
|
||||||
gcWorld=\u00a76{0} "\u00a7c{1}\u00a76": \u00a7c{2}\u00a76 chunks, \u00a7c{3}\u00a76 entities
|
gcWorld=\u00a76{0} "\u00a7c{1}\u00a76": \u00a7c{2}\u00a76 chunks, \u00a7c{3}\u00a76 entities
|
||||||
|
invalidHomeName=\u00a74Invalid home name
|
||||||
|
@@ -457,3 +457,4 @@ uptime=\u00a76Uptime:\u00a7c {0}
|
|||||||
antiBuildCraft=\u00a74You are not permitted to create\u00a7c {0}\u00a74.
|
antiBuildCraft=\u00a74You are not permitted to create\u00a7c {0}\u00a74.
|
||||||
antiBuildDrop=\u00a74You are not permitted to drop\u00a7c {0}\u00a74.
|
antiBuildDrop=\u00a74You are not permitted to drop\u00a7c {0}\u00a74.
|
||||||
gcWorld=\u00a76{0} "\u00a7c{1}\u00a76": \u00a7c{2}\u00a76 chunks, \u00a7c{3}\u00a76 entities
|
gcWorld=\u00a76{0} "\u00a7c{1}\u00a76": \u00a7c{2}\u00a76 chunks, \u00a7c{3}\u00a76 entities
|
||||||
|
invalidHomeName=\u00a74Invalid home name
|
||||||
|
@@ -230,7 +230,7 @@ nickChanged=Nickname ge\u00e4ndert.
|
|||||||
nickDisplayName=\u00a77Du musst \u00a7fchange-displayname\u00a7c in der Essentials-Config aktivieren.
|
nickDisplayName=\u00a77Du musst \u00a7fchange-displayname\u00a7c in der Essentials-Config aktivieren.
|
||||||
nickInUse=\u00a7cDieser Name wird bereits verwendet.
|
nickInUse=\u00a7cDieser Name wird bereits verwendet.
|
||||||
nickNamesAlpha=\u00a7cNicknamen d\u00fcrfen nur alphanumerische Zeichen enthalten.
|
nickNamesAlpha=\u00a7cNicknamen d\u00fcrfen nur alphanumerische Zeichen enthalten.
|
||||||
nickNoMore=\u00a7Du hast keinen Nicknamen mehr.
|
nickNoMore=\u00a7cDu hast keinen Nicknamen mehr.
|
||||||
nickOthersPermission=\u00a7cDu hast keine Rechte um den Nicknamen von anderen zu \u00e4ndern.
|
nickOthersPermission=\u00a7cDu hast keine Rechte um den Nicknamen von anderen zu \u00e4ndern.
|
||||||
nickSet=\u00a77Dein Nickname ist nun \u00a7c{0}
|
nickSet=\u00a77Dein Nickname ist nun \u00a7c{0}
|
||||||
noAccessCommand=\u00a7cDu hast keinen Zugriff auf diesen Befehl.
|
noAccessCommand=\u00a7cDu hast keinen Zugriff auf diesen Befehl.
|
||||||
@@ -457,3 +457,4 @@ uptime=\u00a76Uptime:\u00a7c {0}
|
|||||||
antiBuildCraft=\u00a74You are not permitted to create\u00a7c {0}\u00a74.
|
antiBuildCraft=\u00a74You are not permitted to create\u00a7c {0}\u00a74.
|
||||||
antiBuildDrop=\u00a74You are not permitted to drop\u00a7c {0}\u00a74.
|
antiBuildDrop=\u00a74You are not permitted to drop\u00a7c {0}\u00a74.
|
||||||
gcWorld=\u00a76{0} "\u00a7c{1}\u00a76": \u00a7c{2}\u00a76 chunks, \u00a7c{3}\u00a76 entities
|
gcWorld=\u00a76{0} "\u00a7c{1}\u00a76": \u00a7c{2}\u00a76 chunks, \u00a7c{3}\u00a76 entities
|
||||||
|
invalidHomeName=\u00a74Invalid home name
|
||||||
|
@@ -457,3 +457,4 @@ uptime=\u00a76Uptime:\u00a7c {0}
|
|||||||
antiBuildCraft=\u00a74You are not permitted to create\u00a7c {0}\u00a74.
|
antiBuildCraft=\u00a74You are not permitted to create\u00a7c {0}\u00a74.
|
||||||
antiBuildDrop=\u00a74You are not permitted to drop\u00a7c {0}\u00a74.
|
antiBuildDrop=\u00a74You are not permitted to drop\u00a7c {0}\u00a74.
|
||||||
gcWorld=\u00a76{0} "\u00a7c{1}\u00a76": \u00a7c{2}\u00a76 chunks, \u00a7c{3}\u00a76 entities
|
gcWorld=\u00a76{0} "\u00a7c{1}\u00a76": \u00a7c{2}\u00a76 chunks, \u00a7c{3}\u00a76 entities
|
||||||
|
invalidHomeName=\u00a74Invalid home name
|
||||||
|
@@ -457,3 +457,4 @@ uptime=\u00a76Uptime:\u00a7c {0}
|
|||||||
antiBuildCraft=\u00a74You are not permitted to create\u00a7c {0}\u00a74.
|
antiBuildCraft=\u00a74You are not permitted to create\u00a7c {0}\u00a74.
|
||||||
antiBuildDrop=\u00a74You are not permitted to drop\u00a7c {0}\u00a74.
|
antiBuildDrop=\u00a74You are not permitted to drop\u00a7c {0}\u00a74.
|
||||||
gcWorld=\u00a76{0} "\u00a7c{1}\u00a76": \u00a7c{2}\u00a76 chunks, \u00a7c{3}\u00a76 entities
|
gcWorld=\u00a76{0} "\u00a7c{1}\u00a76": \u00a7c{2}\u00a76 chunks, \u00a7c{3}\u00a76 entities
|
||||||
|
invalidHomeName=\u00a74Invalid home name
|
||||||
|
@@ -457,3 +457,4 @@ uptime=\u00a76Uptime:\u00a7c {0}
|
|||||||
antiBuildCraft=\u00a74You are not permitted to create\u00a7c {0}\u00a74.
|
antiBuildCraft=\u00a74You are not permitted to create\u00a7c {0}\u00a74.
|
||||||
antiBuildDrop=\u00a74You are not permitted to drop\u00a7c {0}\u00a74.
|
antiBuildDrop=\u00a74You are not permitted to drop\u00a7c {0}\u00a74.
|
||||||
gcWorld=\u00a76{0} "\u00a7c{1}\u00a76": \u00a7c{2}\u00a76 chunks, \u00a7c{3}\u00a76 entities
|
gcWorld=\u00a76{0} "\u00a7c{1}\u00a76": \u00a7c{2}\u00a76 chunks, \u00a7c{3}\u00a76 entities
|
||||||
|
invalidHomeName=\u00a74Invalid home name
|
||||||
|
@@ -457,3 +457,4 @@ uptime=\u00a76Uptime:\u00a7c {0}
|
|||||||
antiBuildCraft=\u00a74You are not permitted to create\u00a7c {0}\u00a74.
|
antiBuildCraft=\u00a74You are not permitted to create\u00a7c {0}\u00a74.
|
||||||
antiBuildDrop=\u00a74You are not permitted to drop\u00a7c {0}\u00a74.
|
antiBuildDrop=\u00a74You are not permitted to drop\u00a7c {0}\u00a74.
|
||||||
gcWorld=\u00a76{0} "\u00a7c{1}\u00a76": \u00a7c{2}\u00a76 chunks, \u00a7c{3}\u00a76 entities
|
gcWorld=\u00a76{0} "\u00a7c{1}\u00a76": \u00a7c{2}\u00a76 chunks, \u00a7c{3}\u00a76 entities
|
||||||
|
invalidHomeName=\u00a74Invalid home name
|
||||||
|
@@ -457,3 +457,4 @@ uptime=\u00a76Uptime:\u00a7c {0}
|
|||||||
antiBuildCraft=\u00a74You are not permitted to create\u00a7c {0}\u00a74.
|
antiBuildCraft=\u00a74You are not permitted to create\u00a7c {0}\u00a74.
|
||||||
antiBuildDrop=\u00a74You are not permitted to drop\u00a7c {0}\u00a74.
|
antiBuildDrop=\u00a74You are not permitted to drop\u00a7c {0}\u00a74.
|
||||||
gcWorld=\u00a76{0} "\u00a7c{1}\u00a76": \u00a7c{2}\u00a76 chunks, \u00a7c{3}\u00a76 entities
|
gcWorld=\u00a76{0} "\u00a7c{1}\u00a76": \u00a7c{2}\u00a76 chunks, \u00a7c{3}\u00a76 entities
|
||||||
|
invalidHomeName=\u00a74Invalid home name
|
||||||
|
@@ -457,3 +457,4 @@ uptime=\u00a76Uptime:\u00a7c {0}
|
|||||||
antiBuildCraft=\u00a74You are not permitted to create\u00a7c {0}\u00a74.
|
antiBuildCraft=\u00a74You are not permitted to create\u00a7c {0}\u00a74.
|
||||||
antiBuildDrop=\u00a74You are not permitted to drop\u00a7c {0}\u00a74.
|
antiBuildDrop=\u00a74You are not permitted to drop\u00a7c {0}\u00a74.
|
||||||
gcWorld=\u00a76{0} "\u00a7c{1}\u00a76": \u00a7c{2}\u00a76 chunks, \u00a7c{3}\u00a76 entities
|
gcWorld=\u00a76{0} "\u00a7c{1}\u00a76": \u00a7c{2}\u00a76 chunks, \u00a7c{3}\u00a76 entities
|
||||||
|
invalidHomeName=\u00a74Invalid home name
|
||||||
|
@@ -457,3 +457,4 @@ uptime=\u00a76Uptime:\u00a7c {0}
|
|||||||
antiBuildCraft=\u00a74You are not permitted to create\u00a7c {0}\u00a74.
|
antiBuildCraft=\u00a74You are not permitted to create\u00a7c {0}\u00a74.
|
||||||
antiBuildDrop=\u00a74You are not permitted to drop\u00a7c {0}\u00a74.
|
antiBuildDrop=\u00a74You are not permitted to drop\u00a7c {0}\u00a74.
|
||||||
gcWorld=\u00a76{0} "\u00a7c{1}\u00a76": \u00a7c{2}\u00a76 chunks, \u00a7c{3}\u00a76 entities
|
gcWorld=\u00a76{0} "\u00a7c{1}\u00a76": \u00a7c{2}\u00a76 chunks, \u00a7c{3}\u00a76 entities
|
||||||
|
invalidHomeName=\u00a74Invalid home name
|
||||||
|
@@ -457,3 +457,4 @@ uptime=\u00a76Uptime:\u00a7c {0}
|
|||||||
antiBuildCraft=\u00a74You are not permitted to create\u00a7c {0}\u00a74.
|
antiBuildCraft=\u00a74You are not permitted to create\u00a7c {0}\u00a74.
|
||||||
antiBuildDrop=\u00a74You are not permitted to drop\u00a7c {0}\u00a74.
|
antiBuildDrop=\u00a74You are not permitted to drop\u00a7c {0}\u00a74.
|
||||||
gcWorld=\u00a76{0} "\u00a7c{1}\u00a76": \u00a7c{2}\u00a76 chunks, \u00a7c{3}\u00a76 entities
|
gcWorld=\u00a76{0} "\u00a7c{1}\u00a76": \u00a7c{2}\u00a76 chunks, \u00a7c{3}\u00a76 entities
|
||||||
|
invalidHomeName=\u00a74Invalid home name
|
||||||
|
@@ -457,3 +457,4 @@ uptime=\u00a76Uptime:\u00a7c {0}
|
|||||||
antiBuildCraft=\u00a74You are not permitted to create\u00a7c {0}\u00a74.
|
antiBuildCraft=\u00a74You are not permitted to create\u00a7c {0}\u00a74.
|
||||||
antiBuildDrop=\u00a74You are not permitted to drop\u00a7c {0}\u00a74.
|
antiBuildDrop=\u00a74You are not permitted to drop\u00a7c {0}\u00a74.
|
||||||
gcWorld=\u00a76{0} "\u00a7c{1}\u00a76": \u00a7c{2}\u00a76 chunks, \u00a7c{3}\u00a76 entities
|
gcWorld=\u00a76{0} "\u00a7c{1}\u00a76": \u00a7c{2}\u00a76 chunks, \u00a7c{3}\u00a76 entities
|
||||||
|
invalidHomeName=\u00a74Invalid home name
|
||||||
|
@@ -198,4 +198,6 @@ v 2.0:
|
|||||||
- Give a better error when a subgroup is null.
|
- Give a better error when a subgroup is null.
|
||||||
- Include the GM version when logging errors.
|
- Include the GM version when logging errors.
|
||||||
- Fix Synchronization on adding subgroups (thanks snowleo).
|
- Fix Synchronization on adding subgroups (thanks snowleo).
|
||||||
- Remove info node support from GlobalGroups. It should not have them as GlobalGroups are only permission collections.
|
- Remove info node support from GlobalGroups. It should not have them as GlobalGroups are only permission collections.
|
||||||
|
- Change order of data in Users.yml to [name, Group, SubGroup, Permissions, Info nodes].
|
||||||
|
- Add alphabetically sorted user lists.
|
@@ -1654,7 +1654,7 @@ public class GroupManager extends JavaPlugin {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
worldsHolder.saveChanges(forced);
|
worldsHolder.saveChanges(forced);
|
||||||
sender.sendMessage(ChatColor.YELLOW + " All changes were saved.");
|
sender.sendMessage(ChatColor.YELLOW + "All changes were saved.");
|
||||||
} catch (IllegalStateException ex) {
|
} catch (IllegalStateException ex) {
|
||||||
sender.sendMessage(ChatColor.RED + ex.getMessage());
|
sender.sendMessage(ChatColor.RED + ex.getMessage());
|
||||||
}
|
}
|
||||||
|
@@ -69,7 +69,7 @@ public class GroupsDataHolder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param groups the groups to set
|
* Resets the Groups
|
||||||
*/
|
*/
|
||||||
public void resetGroups() {
|
public void resetGroups() {
|
||||||
this.groups.clear();
|
this.groups.clear();
|
||||||
|
@@ -52,7 +52,7 @@ public class UsersDataHolder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param users the users to set
|
* Resets the Users
|
||||||
*/
|
*/
|
||||||
public void resetUsers() {
|
public void resetUsers() {
|
||||||
this.users.clear();
|
this.users.clear();
|
||||||
|
@@ -15,8 +15,10 @@ import java.util.ArrayList;
|
|||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.TreeSet;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
import org.anjocaido.groupmanager.GroupManager;
|
import org.anjocaido.groupmanager.GroupManager;
|
||||||
@@ -37,9 +39,9 @@ import org.yaml.snakeyaml.constructor.SafeConstructor;
|
|||||||
import org.yaml.snakeyaml.reader.UnicodeReader;
|
import org.yaml.snakeyaml.reader.UnicodeReader;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* One instance of this should exist per world/mirror
|
* One instance of this should exist per world/mirror it contains all functions
|
||||||
* it contains all functions to manage these data sets
|
* to manage these data sets and points to the relevant users and groups
|
||||||
* and points to the relevant users and groups objects.
|
* objects.
|
||||||
*
|
*
|
||||||
* @author gabrielcouto, ElgarL
|
* @author gabrielcouto, ElgarL
|
||||||
*/
|
*/
|
||||||
@@ -100,8 +102,8 @@ public class WorldDataHolder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Search for a user. If it doesn't exist, create a new one with
|
* Search for a user. If it doesn't exist, create a new one with default
|
||||||
* default group.
|
* group.
|
||||||
*
|
*
|
||||||
* @param userName the name of the user
|
* @param userName the name of the user
|
||||||
* @return class that manage that user permission
|
* @return class that manage that user permission
|
||||||
@@ -207,8 +209,8 @@ public class WorldDataHolder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check if a group exists.
|
* Check if a group exists. Its the same of getGroup, but check if it is
|
||||||
* Its the same of getGroup, but check if it is null.
|
* null.
|
||||||
*
|
*
|
||||||
* @param groupName the name of the group
|
* @param groupName the name of the group
|
||||||
* @return true if exists. false if not.
|
* @return true if exists. false if not.
|
||||||
@@ -272,8 +274,7 @@ public class WorldDataHolder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new User with the given name
|
* Creates a new User with the given name and adds it to this holder.
|
||||||
* and adds it to this holder.
|
|
||||||
*
|
*
|
||||||
* @param userName the username you want
|
* @param userName the username you want
|
||||||
* @return null if user already exists. or new User
|
* @return null if user already exists. or new User
|
||||||
@@ -291,8 +292,7 @@ public class WorldDataHolder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new Group with the given name
|
* Creates a new Group with the given name and adds it to this holder
|
||||||
* and adds it to this holder
|
|
||||||
*
|
*
|
||||||
* @param groupName the groupname you want
|
* @param groupName the groupname you want
|
||||||
* @return null if group already exists. or new Group
|
* @return null if group already exists. or new Group
|
||||||
@@ -319,7 +319,8 @@ public class WorldDataHolder {
|
|||||||
* @return a collection of the groups
|
* @return a collection of the groups
|
||||||
*/
|
*/
|
||||||
public Collection<Group> getGroupList() {
|
public Collection<Group> getGroupList() {
|
||||||
synchronized(getGroups()) {
|
|
||||||
|
synchronized (getGroups()) {
|
||||||
return new ArrayList<Group>(getGroups().values());
|
return new ArrayList<Group>(getGroups().values());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -329,7 +330,8 @@ public class WorldDataHolder {
|
|||||||
* @return a collection of the users
|
* @return a collection of the users
|
||||||
*/
|
*/
|
||||||
public Collection<User> getUserList() {
|
public Collection<User> getUserList() {
|
||||||
synchronized(getUsers()) {
|
|
||||||
|
synchronized (getUsers()) {
|
||||||
return new ArrayList<User>(getUsers().values());
|
return new ArrayList<User>(getUsers().values());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -510,7 +512,7 @@ public class WorldDataHolder {
|
|||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
throw new IllegalArgumentException("Your " + groupsFile.getPath() + " file is invalid. See console for details.", ex);
|
throw new IllegalArgumentException("Your " + groupsFile.getPath() + " file is invalid. See console for details.", ex);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (allGroupsNode == null) {
|
if (allGroupsNode == null) {
|
||||||
throw new IllegalArgumentException("You have no groups in " + groupsFile.getPath() + ".");
|
throw new IllegalArgumentException("You have no groups in " + groupsFile.getPath() + ".");
|
||||||
}
|
}
|
||||||
@@ -520,8 +522,7 @@ public class WorldDataHolder {
|
|||||||
Integer groupCount = 0;
|
Integer groupCount = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* loop each group entry
|
* loop each group entry and process it's data.
|
||||||
* and process it's data.
|
|
||||||
*/
|
*/
|
||||||
while (groupItr.hasNext()) {
|
while (groupItr.hasNext()) {
|
||||||
|
|
||||||
@@ -545,8 +546,7 @@ public class WorldDataHolder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create a new group with this name
|
* Create a new group with this name in the assigned data source.
|
||||||
* in the assigned data source.
|
|
||||||
*/
|
*/
|
||||||
Group thisGrp = ph.createGroup(groupKey);
|
Group thisGrp = ph.createGroup(groupKey);
|
||||||
|
|
||||||
@@ -569,8 +569,8 @@ public class WorldDataHolder {
|
|||||||
*/
|
*/
|
||||||
} else if ((Boolean.parseBoolean(nodeData.toString()))) {
|
} else if ((Boolean.parseBoolean(nodeData.toString()))) {
|
||||||
/*
|
/*
|
||||||
* Set this as the default group.
|
* Set this as the default group. Warn if some other group has
|
||||||
* Warn if some other group has already claimed that position.
|
* already claimed that position.
|
||||||
*/
|
*/
|
||||||
if (ph.getDefaultGroup() != null) {
|
if (ph.getDefaultGroup() != null) {
|
||||||
GroupManager.logger.warning("The group '" + thisGrp.getName() + "' is claiming to be default where '" + ph.getDefaultGroup().getName() + "' already was.");
|
GroupManager.logger.warning("The group '" + thisGrp.getName() + "' is claiming to be default where '" + ph.getDefaultGroup().getName() + "' already was.");
|
||||||
@@ -590,8 +590,7 @@ public class WorldDataHolder {
|
|||||||
|
|
||||||
if (nodeData == null) {
|
if (nodeData == null) {
|
||||||
/*
|
/*
|
||||||
* If no permissions node is found, or it's empty
|
* If no permissions node is found, or it's empty do nothing.
|
||||||
* do nothing.
|
|
||||||
*/
|
*/
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
@@ -677,8 +676,8 @@ public class WorldDataHolder {
|
|||||||
if (nodeData == null || nodeData instanceof List) {
|
if (nodeData == null || nodeData instanceof List) {
|
||||||
if (nodeData == null) {
|
if (nodeData == null) {
|
||||||
/*
|
/*
|
||||||
* If no inheritance node is found, or it's empty
|
* If no inheritance node is found, or it's empty do
|
||||||
* do nothing.
|
* nothing.
|
||||||
*/
|
*/
|
||||||
} else if (nodeData instanceof List) {
|
} else if (nodeData instanceof List) {
|
||||||
|
|
||||||
@@ -790,10 +789,10 @@ public class WorldDataHolder {
|
|||||||
// Attempt to fetch the next user name.
|
// Attempt to fetch the next user name.
|
||||||
node = usersItr.next();
|
node = usersItr.next();
|
||||||
if (node instanceof Integer)
|
if (node instanceof Integer)
|
||||||
usersKey = Integer.toString((Integer)node);
|
usersKey = Integer.toString((Integer) node);
|
||||||
else
|
else
|
||||||
usersKey = node.toString();
|
usersKey = node.toString();
|
||||||
|
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
throw new IllegalArgumentException("Invalid node type for user entry (" + userCount + ") in file: " + usersFile.getPath(), ex);
|
throw new IllegalArgumentException("Invalid node type for user entry (" + userCount + ") in file: " + usersFile.getPath(), ex);
|
||||||
}
|
}
|
||||||
@@ -821,8 +820,8 @@ public class WorldDataHolder {
|
|||||||
|
|
||||||
if (nodeData == null) {
|
if (nodeData == null) {
|
||||||
/*
|
/*
|
||||||
* If no permissions node is found, or it's empty
|
* If no permissions node is found, or it's empty do
|
||||||
* do nothing.
|
* nothing.
|
||||||
*/
|
*/
|
||||||
} else {
|
} else {
|
||||||
if (nodeData instanceof List) {
|
if (nodeData instanceof List) {
|
||||||
@@ -858,8 +857,7 @@ public class WorldDataHolder {
|
|||||||
|
|
||||||
if (nodeData == null) {
|
if (nodeData == null) {
|
||||||
/*
|
/*
|
||||||
* If no subgroups node is found, or it's empty
|
* If no subgroups node is found, or it's empty do nothing.
|
||||||
* do nothing.
|
|
||||||
*/
|
*/
|
||||||
} else if (nodeData instanceof List) {
|
} else if (nodeData instanceof List) {
|
||||||
for (Object o : ((List) nodeData)) {
|
for (Object o : ((List) nodeData)) {
|
||||||
@@ -894,8 +892,7 @@ public class WorldDataHolder {
|
|||||||
|
|
||||||
if (nodeData == null) {
|
if (nodeData == null) {
|
||||||
/*
|
/*
|
||||||
* If no info node is found, or it's empty
|
* If no info node is found, or it's empty do nothing.
|
||||||
* do nothing.
|
|
||||||
*/
|
*/
|
||||||
} else if (nodeData instanceof Map) {
|
} else if (nodeData instanceof Map) {
|
||||||
thisUser.setVariables((Map<String, Object>) nodeData);
|
thisUser.setVariables((Map<String, Object>) nodeData);
|
||||||
@@ -946,29 +943,29 @@ public class WorldDataHolder {
|
|||||||
Map<String, Object> groupsMap = new HashMap<String, Object>();
|
Map<String, Object> groupsMap = new HashMap<String, Object>();
|
||||||
|
|
||||||
root.put("groups", groupsMap);
|
root.put("groups", groupsMap);
|
||||||
synchronized(ph.getGroups()) {
|
synchronized (ph.getGroups()) {
|
||||||
for (String groupKey : ph.getGroups().keySet()) {
|
for (String groupKey : ph.getGroups().keySet()) {
|
||||||
Group group = ph.getGroups().get(groupKey);
|
Group group = ph.getGroups().get(groupKey);
|
||||||
|
|
||||||
Map<String, Object> aGroupMap = new HashMap<String, Object>();
|
Map<String, Object> aGroupMap = new HashMap<String, Object>();
|
||||||
groupsMap.put(group.getName(), aGroupMap);
|
groupsMap.put(group.getName(), aGroupMap);
|
||||||
|
|
||||||
if (ph.getDefaultGroup() == null) {
|
if (ph.getDefaultGroup() == null) {
|
||||||
GroupManager.logger.severe("There is no default group for world: " + ph.getName());
|
GroupManager.logger.severe("There is no default group for world: " + ph.getName());
|
||||||
|
}
|
||||||
|
aGroupMap.put("default", group.equals(ph.getDefaultGroup()));
|
||||||
|
|
||||||
|
Map<String, Object> infoMap = new HashMap<String, Object>();
|
||||||
|
aGroupMap.put("info", infoMap);
|
||||||
|
|
||||||
|
for (String infoKey : group.getVariables().getVarKeyList()) {
|
||||||
|
infoMap.put(infoKey, group.getVariables().getVarObject(infoKey));
|
||||||
|
}
|
||||||
|
|
||||||
|
aGroupMap.put("inheritance", group.getInherits());
|
||||||
|
|
||||||
|
aGroupMap.put("permissions", group.getPermissionList());
|
||||||
}
|
}
|
||||||
aGroupMap.put("default", group.equals(ph.getDefaultGroup()));
|
|
||||||
|
|
||||||
Map<String, Object> infoMap = new HashMap<String, Object>();
|
|
||||||
aGroupMap.put("info", infoMap);
|
|
||||||
|
|
||||||
for (String infoKey : group.getVariables().getVarKeyList()) {
|
|
||||||
infoMap.put(infoKey, group.getVariables().getVarObject(infoKey));
|
|
||||||
}
|
|
||||||
|
|
||||||
aGroupMap.put("inheritance", group.getInherits());
|
|
||||||
|
|
||||||
aGroupMap.put("permissions", group.getPermissionList());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!root.isEmpty()) {
|
if (!root.isEmpty()) {
|
||||||
@@ -1008,18 +1005,9 @@ public class WorldDataHolder {
|
|||||||
GroupManagerEventHandler.callEvent(GMSystemEvent.Action.SAVED);
|
GroupManagerEventHandler.callEvent(GMSystemEvent.Action.SAVED);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* FileWriter tx = null;
|
* FileWriter tx = null; try { tx = new FileWriter(groupsFile, false);
|
||||||
* try {
|
* tx.write(yaml.dump(root)); tx.flush(); } catch (Exception e) { }
|
||||||
* tx = new FileWriter(groupsFile, false);
|
* finally { try { tx.close(); } catch (IOException ex) { } }
|
||||||
* tx.write(yaml.dump(root));
|
|
||||||
* tx.flush();
|
|
||||||
* } catch (Exception e) {
|
|
||||||
* } finally {
|
|
||||||
* try {
|
|
||||||
* tx.close();
|
|
||||||
* } catch (IOException ex) {
|
|
||||||
* }
|
|
||||||
* }
|
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1032,39 +1020,45 @@ public class WorldDataHolder {
|
|||||||
public static void writeUsers(WorldDataHolder ph, File usersFile) {
|
public static void writeUsers(WorldDataHolder ph, File usersFile) {
|
||||||
|
|
||||||
Map<String, Object> root = new HashMap<String, Object>();
|
Map<String, Object> root = new HashMap<String, Object>();
|
||||||
|
LinkedHashMap<String, Object> usersMap = new LinkedHashMap<String, Object>();
|
||||||
Map<String, Object> usersMap = new HashMap<String, Object>();
|
|
||||||
root.put("users", usersMap);
|
root.put("users", usersMap);
|
||||||
synchronized(ph.getUsers()) {
|
synchronized (ph.getUsers()) {
|
||||||
for (String userKey : ph.getUsers().keySet()) {
|
|
||||||
User user = ph.getUsers().get(userKey);
|
// A sorted list of users.
|
||||||
if ((user.getGroup() == null || user.getGroup().equals(ph.getDefaultGroup())) && user.getPermissionList().isEmpty() && user.getVariables().isEmpty() && user.isSubGroupsEmpty()) {
|
for (String userKey : new TreeSet<String>(ph.getUsers().keySet())) {
|
||||||
continue;
|
User user = ph.getUsers().get(userKey);
|
||||||
}
|
if ((user.getGroup() == null || user.getGroup().equals(ph.getDefaultGroup())) && user.getPermissionList().isEmpty() && user.getVariables().isEmpty() && user.isSubGroupsEmpty()) {
|
||||||
|
continue;
|
||||||
Map<String, Object> aUserMap = new HashMap<String, Object>();
|
|
||||||
usersMap.put(user.getName(), aUserMap);
|
|
||||||
|
|
||||||
if (user.getGroup() == null) {
|
|
||||||
aUserMap.put("group", ph.getDefaultGroup().getName());
|
|
||||||
} else {
|
|
||||||
aUserMap.put("group", user.getGroup().getName());
|
|
||||||
}
|
|
||||||
// USER INFO NODE - BETA
|
|
||||||
if (user.getVariables().getSize() > 0) {
|
|
||||||
Map<String, Object> infoMap = new HashMap<String, Object>();
|
|
||||||
aUserMap.put("info", infoMap);
|
|
||||||
for (String infoKey : user.getVariables().getVarKeyList()) {
|
|
||||||
infoMap.put(infoKey, user.getVariables().getVarObject(infoKey));
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
// END USER INFO NODE - BETA
|
|
||||||
aUserMap.put("permissions", user.getPermissionList());
|
|
||||||
|
|
||||||
// SUBGROUPS NODE - BETA
|
LinkedHashMap<String, Object> aUserMap = new LinkedHashMap<String, Object>();
|
||||||
aUserMap.put("subgroups", user.subGroupListStringCopy());
|
usersMap.put(user.getName(), aUserMap);
|
||||||
// END SUBGROUPS NODE - BETA
|
|
||||||
}
|
// GROUP NODE
|
||||||
|
if (user.getGroup() == null) {
|
||||||
|
aUserMap.put("group", ph.getDefaultGroup().getName());
|
||||||
|
} else {
|
||||||
|
aUserMap.put("group", user.getGroup().getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
// SUBGROUPS NODE
|
||||||
|
aUserMap.put("subgroups", user.subGroupListStringCopy());
|
||||||
|
|
||||||
|
// PERMISSIONS NODE
|
||||||
|
aUserMap.put("permissions", user.getPermissionList());
|
||||||
|
|
||||||
|
// USER INFO NODE - BETA
|
||||||
|
if (user.getVariables().getSize() > 0) {
|
||||||
|
Map<String, Object> infoMap = new HashMap<String, Object>();
|
||||||
|
aUserMap.put("info", infoMap);
|
||||||
|
for (String infoKey : user.getVariables().getVarKeyList()) {
|
||||||
|
infoMap.put(infoKey, user.getVariables().getVarObject(infoKey));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// END USER INFO NODE - BETA
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!root.isEmpty()) {
|
if (!root.isEmpty()) {
|
||||||
@@ -1090,32 +1084,20 @@ public class WorldDataHolder {
|
|||||||
GroupManagerEventHandler.callEvent(GMSystemEvent.Action.SAVED);
|
GroupManagerEventHandler.callEvent(GMSystemEvent.Action.SAVED);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* FileWriter tx = null;
|
* FileWriter tx = null; try { tx = new FileWriter(usersFile, false);
|
||||||
* try {
|
* tx.write(yaml.dump(root)); tx.flush(); } catch (Exception e) { }
|
||||||
* tx = new FileWriter(usersFile, false);
|
* finally { try { tx.close(); } catch (IOException ex) { } }
|
||||||
* tx.write(yaml.dump(root));
|
|
||||||
* tx.flush();
|
|
||||||
* } catch (Exception e) {
|
|
||||||
* } finally {
|
|
||||||
* try {
|
|
||||||
* tx.close();
|
|
||||||
* } catch (IOException ex) {
|
|
||||||
* }
|
|
||||||
* }
|
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Don't use this. Unless you want to make this plugin to interact with
|
* Don't use this. Unless you want to make this plugin to interact with
|
||||||
* original Nijikokun Permissions
|
* original Nijikokun Permissions This method is supposed to make the
|
||||||
* This method is supposed to make the original one reload the file, and
|
* original one reload the file, and propagate the changes made here.
|
||||||
* propagate the changes made here.
|
|
||||||
*
|
*
|
||||||
* Prefer to use the AnjoCaido's fake version of Nijikokun's Permission
|
* Prefer to use the AnjoCaido's fake version of Nijikokun's Permission
|
||||||
* plugin.
|
* plugin. The AnjoCaido's Permission can propagate the changes made on this
|
||||||
* The AnjoCaido's Permission can propagate the changes made on this plugin
|
* plugin instantly, without need to save the file.
|
||||||
* instantly,
|
|
||||||
* without need to save the file.
|
|
||||||
*
|
*
|
||||||
* @param server the server that holds the plugin
|
* @param server the server that holds the plugin
|
||||||
* @deprecated it is not used anymore... unless if you use original
|
* @deprecated it is not used anymore... unless if you use original
|
||||||
@@ -1165,13 +1147,13 @@ public class WorldDataHolder {
|
|||||||
if (users.HaveUsersChanged()) {
|
if (users.HaveUsersChanged()) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
synchronized(users.getUsers()) {
|
synchronized (users.getUsers()) {
|
||||||
for (User u : users.getUsers().values()) {
|
for (User u : users.getUsers().values()) {
|
||||||
if (u.isChanged()) {
|
if (u.isChanged()) {
|
||||||
return true;
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1192,13 +1174,13 @@ public class WorldDataHolder {
|
|||||||
if (groups.HaveGroupsChanged()) {
|
if (groups.HaveGroupsChanged()) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
synchronized(groups.getGroups()) {
|
synchronized (groups.getGroups()) {
|
||||||
for (Group g : groups.getGroups().values()) {
|
for (Group g : groups.getGroups().values()) {
|
||||||
if (g.isChanged()) {
|
if (g.isChanged()) {
|
||||||
return true;
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1208,10 +1190,10 @@ public class WorldDataHolder {
|
|||||||
public void removeUsersChangedFlag() {
|
public void removeUsersChangedFlag() {
|
||||||
|
|
||||||
setUsersChanged(false);
|
setUsersChanged(false);
|
||||||
synchronized(getUsers()) {
|
synchronized (getUsers()) {
|
||||||
for (User u : getUsers().values()) {
|
for (User u : getUsers().values()) {
|
||||||
u.flagAsSaved();
|
u.flagAsSaved();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1221,10 +1203,10 @@ public class WorldDataHolder {
|
|||||||
public void removeGroupsChangedFlag() {
|
public void removeGroupsChangedFlag() {
|
||||||
|
|
||||||
setGroupsChanged(false);
|
setGroupsChanged(false);
|
||||||
synchronized(getGroups()) {
|
synchronized (getGroups()) {
|
||||||
for (Group g : getGroups().values()) {
|
for (Group g : getGroups().values()) {
|
||||||
g.flagAsSaved();
|
g.flagAsSaved();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1281,11 +1263,13 @@ public class WorldDataHolder {
|
|||||||
* Resets Users
|
* Resets Users
|
||||||
*/
|
*/
|
||||||
public void resetUsers() {
|
public void resetUsers() {
|
||||||
|
|
||||||
users.resetUsers();
|
users.resetUsers();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Note: Iteration over this object has to be synchronized!
|
* Note: Iteration over this object has to be synchronized!
|
||||||
|
*
|
||||||
* @return the groups
|
* @return the groups
|
||||||
*/
|
*/
|
||||||
public Map<String, Group> getGroups() {
|
public Map<String, Group> getGroups() {
|
||||||
@@ -1295,6 +1279,7 @@ public class WorldDataHolder {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Note: Iteration over this object has to be synchronized!
|
* Note: Iteration over this object has to be synchronized!
|
||||||
|
*
|
||||||
* @return the users
|
* @return the users
|
||||||
*/
|
*/
|
||||||
public Map<String, User> getUsers() {
|
public Map<String, User> getUsers() {
|
||||||
|
@@ -1,15 +1,15 @@
|
|||||||
# "For a more advanced configuration example utilizing the advanced features of GroupManager, see http://pastebin.com/a8ZA0j5G"
|
# "For a more advanced configuration example utilizing the advanced features of GroupManager, see http://pastebin.com/a8ZA0j5G"
|
||||||
users:
|
users:
|
||||||
snowleo:
|
snowleo:
|
||||||
subgroups: []
|
|
||||||
permissions: []
|
|
||||||
group: Builder
|
group: Builder
|
||||||
|
subgroups: []
|
||||||
|
permissions: []
|
||||||
KHobbits:
|
KHobbits:
|
||||||
|
group: Moderator
|
||||||
subgroups: []
|
subgroups: []
|
||||||
permissions: []
|
permissions: []
|
||||||
group: Moderator
|
|
||||||
ElgarL:
|
ElgarL:
|
||||||
|
group: Moderator
|
||||||
subgroups: []
|
subgroups: []
|
||||||
permissions: []
|
permissions: []
|
||||||
group: Moderator
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user