This commit is contained in:
ElgarL 2012-10-01 17:50:08 +01:00
commit 8cf2ce7b73
33 changed files with 609 additions and 249 deletions

View File

@ -7,6 +7,7 @@ import java.util.logging.Logger;
import org.bukkit.Material;
import org.bukkit.entity.Ageable;
import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
@ -46,7 +47,7 @@ public class EssentialsEntityListener implements Listener
{
event.setCancelled(true);
}
if (attacker.isGodModeEnabled() && !attacker.isAuthorized("essentials.god.pvp"))
{
event.setCancelled(true);
@ -161,4 +162,16 @@ public class EssentialsEntityListener implements Listener
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);
}
}
}
}

View File

@ -37,13 +37,14 @@ public class Teleport implements Runnable, ITeleport
{
if (this.name != null)
{
return ess.getServer().getPlayerExact(name).getLocation();
}
return location;
}
}
private IUser user;
private IUser teleportUser;
private int teleTimer = -1;
private long started; // time this task was initiated
private long delay; // how long to delay the teleport
@ -61,13 +62,19 @@ public class Teleport implements Runnable, ITeleport
private 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.delay = delay;
this.health = user.getHealth();
this.initX = Math.round(user.getLocation().getX() * MOVE_CONSTANT);
this.initY = Math.round(user.getLocation().getY() * MOVE_CONSTANT);
this.initZ = Math.round(user.getLocation().getZ() * MOVE_CONSTANT);
this.health = teleportUser.getHealth();
this.initX = Math.round(teleportUser.getLocation().getX() * MOVE_CONSTANT);
this.initY = Math.round(teleportUser.getLocation().getY() * MOVE_CONSTANT);
this.initZ = Math.round(teleportUser.getLocation().getZ() * MOVE_CONSTANT);
this.teleportUser = teleportUser;
this.teleportTarget = target;
this.chargeFor = chargeFor;
this.cause = cause;
@ -79,31 +86,38 @@ public class Teleport implements Runnable, ITeleport
if (user == null || !user.isOnline() || user.getLocation() == null)
{
cancel();
cancel(false);
return;
}
if (Math.round(user.getLocation().getX() * MOVE_CONSTANT) != initX
|| Math.round(user.getLocation().getY() * MOVE_CONSTANT) != initY
|| Math.round(user.getLocation().getZ() * MOVE_CONSTANT) != initZ
|| user.getHealth() < health)
{ // user moved, cancel teleport
if (teleportUser == null || !teleportUser.isOnline() || teleportUser.getLocation() == null)
{
cancel(false);
return;
}
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);
return;
}
health = user.getHealth(); // in case user healed, then later gets injured
health = teleportUser.getHealth(); // in case user healed, then later gets injured
long now = System.currentTimeMillis();
if (now > started + delay)
{
try
{
cooldown(false);
user.sendMessage(_("teleportationCommencing"));
teleportUser.sendMessage(_("teleportationCommencing"));
try
{
now(teleportTarget, cause);
teleportUser.getTeleport().now(teleportTarget, cause);
cancel(false);
if (chargeFor != null)
{
chargeFor.charge(user);
@ -117,6 +131,10 @@ public class Teleport implements Runnable, ITeleport
catch (Exception ex)
{
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;
}
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
{
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)
{
if (teleTimer == -1)
@ -193,6 +196,10 @@ public class Teleport implements Runnable, ITeleport
if (notifyUser)
{
user.sendMessage(_("pendingTeleportCancelled"));
if (teleportUser != user)
{
teleportUser.sendMessage(_("pendingTeleportCancelled"));
}
}
}
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);
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
{
teleport(new Target(loc), chargeFor, TeleportCause.PLUGIN);
teleport(loc, chargeFor, TeleportCause.PLUGIN);
}
public void teleport(Location loc, Trade chargeFor, TeleportCause cause) throws Exception
{
teleport(new Target(loc), chargeFor, cause);
@ -241,58 +272,82 @@ public class Teleport implements Runnable, ITeleport
return;
}
cancel();
Calendar c = new GregorianCalendar();
c.add(Calendar.SECOND, (int)delay);
c.add(Calendar.MILLISECOND, (int)((delay * 1000.0) % 1000.0));
user.sendMessage(_("dontMoveMessage", Util.formatDateDiff(c.getTimeInMillis())));
cancel(false);
warnUser(user);
initTimer((long)(delay * 1000.0), target, chargeFor, cause);
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();
user.setLastLocation();
user.getBase().teleport(Util.getSafeDestination(target.getLocation()), cause);
}
Target target = new Target(user);
public void now(Location loc, boolean cooldown, TeleportCause cause) throws Exception
{
if (cooldown)
double delay = ess.getSettings().getTeleportDelay();
if (chargeFor != null)
{
chargeFor.isAffordableFor(user);
}
cooldown(true);
if (delay <= 0 || user.isAuthorized("essentials.teleport.timer.bypass"))
{
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);
chargeFor.charge(user);
now(new Target(loc), cause);
Calendar c = new GregorianCalendar();
c.add(Calendar.SECOND, (int)delay);
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)
{
cooldown(false);
}
now(new Target(entity), cause);
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);
}
//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
{
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
{
now(new Target(user.getLastLocation()), TeleportCause.COMMAND);
}
//This function handles teleporting to /home
public void home(Location loc, Trade chargeFor) throws Exception
{
teleport(new Target(loc), chargeFor, TeleportCause.COMMAND);

View File

@ -23,10 +23,13 @@ public class Util
private final static Logger logger = Logger.getLogger("Minecraft");
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 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)
{
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;
}

View File

@ -44,7 +44,7 @@ public class Commandban extends EssentialsCommand
}
else
{
if (user.isAuthorized("essentials.ban.exempt"))
if (user.isAuthorized("essentials.ban.exempt") && sender instanceof Player)
{
sender.sendMessage(_("banExempt"));
return;

View File

@ -6,6 +6,8 @@ import java.util.List;
import org.bukkit.Server;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
public class Commandheal extends EssentialsCommand
@ -33,9 +35,7 @@ public class Commandheal extends EssentialsCommand
{
user.healCooldown();
}
user.setHealth(20);
user.setFoodLevel(20);
user.sendMessage(_("heal"));
healPlayer(user);
}
@Override
@ -63,10 +63,19 @@ public class Commandheal extends EssentialsCommand
{
continue;
}
p.setHealth(20);
p.setFoodLevel(20);
p.sendMessage(_("heal"));
healPlayer(p);
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());
}
}
}

View File

@ -2,7 +2,9 @@ package com.earth2me.essentials.commands;
import static com.earth2me.essentials.I18n._;
import com.earth2me.essentials.User;
import com.earth2me.essentials.Util;
import java.util.Locale;
import java.util.regex.Pattern;
import org.bukkit.Location;
import org.bukkit.Server;
@ -55,9 +57,10 @@ public class Commandsethome extends EssentialsCommand
{
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);
user.sendMessage(_("homeSet", user.getLocation().getWorld().getName(), user.getLocation().getBlockX(), user.getLocation().getBlockY(), user.getLocation().getBlockZ()));

View File

@ -7,6 +7,7 @@ import java.util.logging.Logger;
import org.bukkit.Server;
import org.bukkit.command.CommandSender;
import org.bukkit.command.PluginCommand;
import org.bukkit.entity.Player;
public class Commandsudo extends EssentialsCommand
@ -26,6 +27,15 @@ public class Commandsudo extends EssentialsCommand
}
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[] arguments = new String[args.length - 2];
if (arguments.length > 0)
@ -33,7 +43,7 @@ public class Commandsudo extends EssentialsCommand
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"));
}

View File

@ -65,12 +65,13 @@ public class Commandtpaccept extends EssentialsCommand
if (user.isTpRequestHere())
{
user.getTeleport().teleport(target, charge, TeleportCause.COMMAND);
target.getTeleport().teleportToMe(user, charge, TeleportCause.COMMAND);
}
else
{
target.getTeleport().teleport(user, charge, TeleportCause.COMMAND);
}
user.requestTeleport(null, false);
throw new NoChargeException();
}
}

View File

@ -27,7 +27,7 @@ public class Commandtphere extends EssentialsCommand
{
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"));
player.sendMessage(_("teleporting"));
throw new NoChargeException();

View File

@ -31,29 +31,26 @@ public class SuperpermsHandler implements IPermissionsHandler
}
@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.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()))
if (base.isPermissionSet(permCheck))
{
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

View File

@ -51,7 +51,7 @@ public class SignKit extends EssentialsSign
final String kitName = sign.getLine(1).toLowerCase(Locale.ENGLISH).trim();
final String group = sign.getLine(2);
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);
charge.isAffordableFor(player);

View File

@ -1,6 +1,7 @@
package com.earth2me.essentials.signs;
import com.earth2me.essentials.ChargeException;
import static com.earth2me.essentials.I18n._;
import com.earth2me.essentials.IEssentials;
import com.earth2me.essentials.Trade;
import com.earth2me.essentials.User;
@ -17,15 +18,13 @@ public class SignWarp extends EssentialsSign
@Override
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);
final String warpName = sign.getLine(1);
if (warpName.isEmpty())
{
ess.getLogger().info("trying to change sign to show error");
sign.setLine(1, "§c<Warp name>");
return false;
throw new SignException(_("invalidSignLine", 1));
}
else
{
@ -54,7 +53,7 @@ public class SignWarp extends EssentialsSign
if ((!group.isEmpty()
&& ("§2Everyone".equals(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);
try

View File

@ -8,7 +8,7 @@
# If you receive an error when Essentials loads, ensure that:
# - No tabs are present: YAML only allows spaces
# - 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
# 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
# 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
# Turn off god mode when people exit
@ -277,7 +277,7 @@ disable-item-pickup-while-afk: false
# Disable this to reduce server lag.
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
# 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
# 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>
# 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
# 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
# is not enabled, any number higher then the maximum stack size results in more than one stack.
# If this number is below 1, the maximum stack size size is given. If over-sized stacks
# are not enabled, any number higher then the maximum stack size results in more than one stack.
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.
# How many items should be in an oversized stack?
# How many items should be in an over-sized stack?
oversized-stacksize: 64
# Allow repair of enchanted weapons and armor.
@ -357,7 +357,7 @@ starting-balance: 0
# These are now defined in worth.yml
# 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:
# /example costs $1000 PER USE
#example: 1000

View File

@ -1,4 +1,4 @@
#version: teamcity
#version: TeamCity
#If you change this file, it will not be automatically updated after the next release,
#item,id,metadata
stone,1,0
@ -1329,7 +1329,6 @@ burningfurnace,62,0
bfurnace,62,0
signpost,63,0
spost,63,0
door,64,0
woodendoorhalf,64,0
wooddoorhalf,64,0
wdoorhalf,64,0
@ -1588,7 +1587,9 @@ tdoor,96,0
doort,96,0
trapd,96,0
dtrap,96,0
monsteregg,97,0
silverfish,97,0
monsteregg,97,0
monstereggsmoothstone,97,0
monstereggsstone,97,0
meggsmoothstone,97,0
@ -3397,6 +3398,7 @@ sign,323,0
woodendoor,324,0
wooddoor,324,0
wdoor,324,0
door,324,0
bucket,325,0
bukkit,325,0
waterbucket,326,0
@ -3946,14 +3948,98 @@ waterbottle,373,0
fullbottle,373,0
watervase,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
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
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
mundaneexpot,373,64
mundaneexpotion,373,64
mundane2potion,373,64
mundaneextendedpot,373,64
mundaneexpot,373,64
mundane2pot,373,64
mundanepotion,373,8192
mundanepot,373,8192
regenerationpotion,373,8193
@ -4308,6 +4394,22 @@ splhealingpot,373,16389
splhealpot,373,16389
spllifepot,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
splashweakpotion,373,16392
splashweaknesspot,373,16392
@ -4339,6 +4441,10 @@ splslowpotion,373,16394
splslownesspot,373,16394
splslowpot,373,16394
spslpot,373,16394
splashdiffusepotion,373,16395
splashdiffusepot,373,16395
spldiffusepotion,373,16395
spldiffusepot,373,16395
splashharmingpotion,373,16396
splashdamagepotion,373,16396
splashdmgpotion,373,16396
@ -4352,6 +4458,74 @@ splharmingpot,373,16396
spldamagepot,373,16396
spldmgpot,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
splashregenerateleveliipotion,373,16417
splashregenleveliipotion,373,16417
@ -4476,6 +4650,22 @@ splheallevel2pot,373,16421
splhealingiipot,373,16421
splhealiipot,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
splashstrongleveliipotion,373,16425
splashstrleveliipotion,373,16425
@ -4513,6 +4703,10 @@ splstrengthiipot,373,16425
splstrongiipot,373,16425
splstriipot,373,16425
spst2pot,373,16425
splashrefinedpotion,373,16427
splashrefinedpot,373,16427
splrefinedpotion,373,16427
splrefinedpot,373,16427
splashharmingleveliipotion,373,16428
splashdamageleveliipotion,373,16428
splashdmgleveliipotion,373,16428
@ -4550,6 +4744,82 @@ splharmingiipot,373,16428
spldamageiipot,373,16428
spldmgiipot,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
splashregenerateextendedpotion,373,16449
splashregenextendepotion,373,16449

1 #version: teamcity #version: TeamCity
2 #If you change this file, it will not be automatically updated after the next release,
3 #item,id,metadata
4 stone,1,0
1329 bfurnace,62,0
1330 signpost,63,0
1331 spost,63,0
door,64,0
1332 woodendoorhalf,64,0
1333 wooddoorhalf,64,0
1334 wdoorhalf,64,0
1587 doort,96,0
1588 trapd,96,0
1589 dtrap,96,0
1590 monsteregg,97,0
1591 silverfish,97,0
1592 monsteregg,97,0
1593 monstereggsmoothstone,97,0
1594 monstereggsstone,97,0
1595 meggsmoothstone,97,0
3398 woodendoor,324,0
3399 wooddoor,324,0
3400 wdoor,324,0
3401 door,324,0
3402 bucket,325,0
3403 bukkit,325,0
3404 waterbucket,326,0
3948 fullbottle,373,0
3949 watervase,373,0
3950 fullvase,373,0
3951 clearpotion,373,6
3952 clearpot,373,6
3953 clearextendedpotion,373,7
3954 clearexpotion,373,7
3955 clear2potion,373,7
3956 clearextendedpot,373,7
3957 clearexpot,373,7
3958 clear2pot,373,7
3959 diffusepotion,373,11
3960 diffusepot,373,11
3961 artlesspotion,373,13
3962 artlesspot,373,13
3963 thinpotion,373,14
3964 thinpot,373,14
3965 thinextendedpotion,373,15
3966 thinexpotion,373,15
3967 thin2potion,373,15
3968 thinextendedpot,373,15
3969 thinexpot,373,15
3970 thin2pot,373,15
3971 awkwardpotion,373,16
3972 awkwardpot,373,16
3973 bunglingpotion,373,22
3974 bunglingpot,373,22
3975 bunglingextendedpotion,373,23
3976 bunglingexpotion,373,23
3977 bungling2potion,373,23
3978 bunglingextendedpot,373,23
3979 bunglingexpot,373,23
3980 bungling2pot,373,23
3981 smoothpotion,373,27
3982 smoothpot,373,27
3983 suavepotion,373,29
3984 suavepot,373,29
3985 debonairpotion,373,30
3986 debonairpot,373,30
3987 debonairextendedpotion,373,31
3988 debonairexpotion,373,31
3989 debonair2potion,373,31
3990 debonairextendedpot,373,31
3991 debonairexpot,373,31
3992 debonair2pot,373,31
3993 thickpotion,373,32
3994 thickpot,373,32
3995 mundaneexpotion,373,64 charmingpotion,373,38
3996 charmingpot,373,38
3997 charmingextendedpotion,373,39
3998 charmingexpotion,373,39
3999 charming2potion,373,39
4000 charmingextendedpot,373,39
4001 charmingexpot,373,39
4002 charming2pot,373,39
4003 refinedpotion,373,43
4004 refinedpot,373,43
4005 cordialpotion,373,45
4006 cordialpot,373,45
4007 sparklingpotion,373,46
4008 sparklingpot,373,46
4009 sparklingextendedpotion,373,47
4010 sparklingexpotion,373,47
4011 sparkling2potion,373,47
4012 sparklingextendedpot,373,47
4013 sparklingexpot,373,47
4014 sparkling2pot,373,47
4015 potentpotion,373,48
4016 potentpot,373,48
4017 rankpotion,373,54
4018 rankpot,373,54
4019 rankextendedpotion,373,55
4020 rankexpotion,373,55
4021 rank2potion,373,55
4022 rankextendedpot,373,55
4023 rankexpot,373,55
4024 rank2pot,373,55
4025 acridpotion,373,59
4026 acridpot,373,59
4027 grosspotion,373,61
4028 grosspot,373,61
4029 stinkypotion,373,62
4030 stinkypot,373,62
4031 stinkyextendedpotion,373,63
4032 stinkyexpotion,373,63
4033 stinky2potion,373,63
4034 stinkyextendedpot,373,63
4035 stinkyexpot,373,63
4036 stinky2pot,373,63
4037 mundaneextendedpotion,373,64
4038 mundaneexpot,373,64 mundaneexpotion,373,64
4039 mundane2potion,373,64
4040 mundaneextendedpot,373,64
4041 mundaneexpot,373,64
4042 mundane2pot,373,64
4043 mundanepotion,373,8192
4044 mundanepot,373,8192
4045 regenerationpotion,373,8193
4394 splhealpot,373,16389
4395 spllifepot,373,16389
4396 sphpot,373,16389
4397 splashclearpotion,373,16390
4398 splashclearpot,373,16390
4399 splclearpotion,373,16390
4400 splclearpot,373,16390
4401 splashclearextendedpotion,373,16391
4402 splashclearexpotion,373,16391
4403 splashclear2potion,373,16391
4404 splashclearextendedpot,373,16391
4405 splashclearexpot,373,16391
4406 splashclear2pot,373,16391
4407 splclearextendedpotion,373,16391
4408 splclearexpotion,373,16391
4409 splclear2potion,373,16391
4410 splclearextendedpot,373,16391
4411 splclearexpot,373,16391
4412 splclear2pot,373,16391
4413 splashweaknesspotion,373,16392
4414 splashweakpotion,373,16392
4415 splashweaknesspot,373,16392
4441 splslownesspot,373,16394
4442 splslowpot,373,16394
4443 spslpot,373,16394
4444 splashdiffusepotion,373,16395
4445 splashdiffusepot,373,16395
4446 spldiffusepotion,373,16395
4447 spldiffusepot,373,16395
4448 splashharmingpotion,373,16396
4449 splashdamagepotion,373,16396
4450 splashdmgpotion,373,16396
4458 spldamagepot,373,16396
4459 spldmgpot,373,16396
4460 spdpot,373,16396
4461 splashartlesspotion,373,16397
4462 splashartlesspot,373,16397
4463 splartlesspotion,373,16397
4464 splartlesspot,373,16397
4465 splashthinpotion,373,16398
4466 splashthinpot,373,16398
4467 splthinpotion,373,16398
4468 splthinpot,373,16398
4469 splashthinextendedpotion,373,16399
4470 splashthinexpotion,373,16399
4471 splashthin2potion,373,16399
4472 splashthinextendedpot,373,16399
4473 splashthinexpot,373,16399
4474 splashthin2pot,373,16399
4475 splthinextendedpotion,373,16399
4476 splthinexpotion,373,16399
4477 splthin2potion,373,16399
4478 splthinextendedpot,373,16399
4479 splthinexpot,373,16399
4480 splthin2pot,373,16399
4481 splashawkwardpotion,373,16400
4482 splashawkwardpot,373,16400
4483 splawkwardpotion,373,16400
4484 splawkwardpot,373,16400
4485 splashbunglingpotion,373,16406
4486 splashbunglingpot,373,16406
4487 splbunglingpotion,373,16406
4488 splbunglingpot,373,16406
4489 splashbunglingextendedpotion,373,16407
4490 splashbunglingexpotion,373,16407
4491 splashbungling2potion,373,16407
4492 splashbunglingextendedpot,373,16407
4493 splashbunglingexpot,373,16407
4494 splashbungling2pot,373,16407
4495 splbunglingextendedpotion,373,16407
4496 splbunglingexpotion,373,16407
4497 splbungling2potion,373,16407
4498 splbunglingextendedpot,373,16407
4499 splbunglingexpot,373,16407
4500 splbungling2pot,373,16407
4501 splashsmoothpotion,373,16411
4502 splashsmoothpot,373,16411
4503 splsmoothpotion,373,16411
4504 splsmoothpot,373,16411
4505 splashsuavepotion,373,16413
4506 splashsuavepot,373,16413
4507 splsuavepotion,373,16413
4508 splsuavepot,373,16413
4509 splashdebonairpotion,373,16414
4510 splashdebonairpot,373,16414
4511 spldebonairpotion,373,16414
4512 spldebonairpot,373,16414
4513 splashdebonairextendedpotion,373,16415
4514 splashdebonairexpotion,373,16415
4515 splashdebonair2potion,373,16415
4516 splashdebonairextendedpot,373,16415
4517 splashdebonairexpot,373,16415
4518 splashdebonair2pot,373,16415
4519 spldebonairextendedpotion,373,16415
4520 spldebonairexpotion,373,16415
4521 spldebonair2potion,373,16415
4522 spldebonairextendedpot,373,16415
4523 spldebonairexpot,373,16415
4524 spldebonair2pot,373,16415
4525 splashthickpotion,373,16416
4526 splashthickpot,373,16416
4527 splthickpotion,373,16416
4528 splthickpot,373,16416
4529 splashregenerationleveliipotion,373,16417
4530 splashregenerateleveliipotion,373,16417
4531 splashregenleveliipotion,373,16417
4650 splhealingiipot,373,16421
4651 splhealiipot,373,16421
4652 sph2pot,373,16421
4653 splashcharmingpotion,373,16422
4654 splashcharmingpot,373,16422
4655 splcharmingpotion,373,16422
4656 splcharmingpot,373,16422
4657 splashcharmingextendedpotion,373,16423
4658 splashcharmingexpotion,373,16423
4659 splashcharming2potion,373,16423
4660 splashcharmingextendedpot,373,16423
4661 splashcharmingexpot,373,16423
4662 splashcharming2pot,373,16423
4663 splcharmingextendedpotion,373,16423
4664 splcharmingexpotion,373,16423
4665 splcharming2potion,373,16423
4666 splcharmingextendedpot,373,16423
4667 splcharmingexpot,373,16423
4668 splcharming2pot,373,16423
4669 splashstrengthleveliipotion,373,16425
4670 splashstrongleveliipotion,373,16425
4671 splashstrleveliipotion,373,16425
4703 splstrongiipot,373,16425
4704 splstriipot,373,16425
4705 spst2pot,373,16425
4706 splashrefinedpotion,373,16427
4707 splashrefinedpot,373,16427
4708 splrefinedpotion,373,16427
4709 splrefinedpot,373,16427
4710 splashharmingleveliipotion,373,16428
4711 splashdamageleveliipotion,373,16428
4712 splashdmgleveliipotion,373,16428
4744 spldamageiipot,373,16428
4745 spldmgiipot,373,16428
4746 spd2pot,373,16428
4747 splashcordialpotion,373,16429
4748 splashcordialpot,373,16429
4749 splcordialpotion,373,16429
4750 splcordialpot,373,16429
4751 splashsparklingpotion,373,16430
4752 splashsparklingpot,373,16430
4753 splsparklingpotion,373,16430
4754 splsparklingpot,373,16430
4755 splashsparklingextendedpotion,373,16431
4756 splashsparklingexpotion,373,16431
4757 splashsparkling2potion,373,16431
4758 splashsparklingextendedpot,373,16431
4759 splashsparklingexpot,373,16431
4760 splashsparkling2pot,373,16431
4761 splsparklingextendedpotion,373,16431
4762 splsparklingexpotion,373,16431
4763 splsparkling2potion,373,16431
4764 splsparklingextendedpot,373,16431
4765 splsparklingexpot,373,16431
4766 splsparkling2pot,373,16431
4767 splashpotentpotion,373,16432
4768 splashpotentpot,373,16432
4769 splpotentpotion,373,16432
4770 splpotentpot,373,16432
4771 splashrankpotion,373,16438
4772 splashrankpot,373,16438
4773 splrankpotion,373,16438
4774 splrankpot,373,16438
4775 splashrankextendedpotion,373,16439
4776 splashrankexpotion,373,16439
4777 splashrank2potion,373,16439
4778 splashrankextendedpot,373,16439
4779 splashrankexpot,373,16439
4780 splashrank2pot,373,16439
4781 splrankextendedpotion,373,16439
4782 splrankexpotion,373,16439
4783 splrank2potion,373,16439
4784 splrankextendedpot,373,16439
4785 splrankexpot,373,16439
4786 splrank2pot,373,16439
4787 splashacridpotion,373,16443
4788 splashacridpot,373,16443
4789 splacridpotion,373,16443
4790 splacridpot,373,16443
4791 splashgrosspotion,373,16445
4792 splashgrosspot,373,16445
4793 splgrosspotion,373,16445
4794 splgrosspot,373,16445
4795 splashstinkypotion,373,16446
4796 splashstinkypot,373,16446
4797 splstinkypotion,373,16446
4798 splstinkypot,373,16446
4799 splashstinkyextendedpotion,373,16447
4800 splashstinkyexpotion,373,16447
4801 splashstinky2potion,373,16447
4802 splashstinkyextendedpot,373,16447
4803 splashstinkyexpot,373,16447
4804 splashstinky2pot,373,16447
4805 splstinkyextendedpotion,373,16447
4806 splstinkyexpotion,373,16447
4807 splstinky2potion,373,16447
4808 splstinkyextendedpot,373,16447
4809 splstinkyexpot,373,16447
4810 splstinky2pot,373,16447
4811 splashmundaneextendedpotion,373,16448
4812 splashmundaneexpotion,373,16448
4813 splashmundane2potion,373,16448
4814 splashmundaneextendedpot,373,16448
4815 splashmundaneexpot,373,16448
4816 splashmundane2pot,373,16448
4817 splmundaneextendedpotion,373,16448
4818 splmundaneexpotion,373,16448
4819 splmundane2potion,373,16448
4820 splmundaneextendedpot,373,16448
4821 splmundaneexpot,373,16448
4822 splmundane2pot,373,16448
4823 splashregenerationextendedpotion,373,16449
4824 splashregenerateextendedpotion,373,16449
4825 splashregenextendepotion,373,16449

View File

@ -457,3 +457,4 @@ uptime=\u00a76Uptime:\u00a7c {0}
antiBuildCraft=\u00a74You are not permitted to create\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
invalidHomeName=\u00a74Invalid home name

View File

@ -460,3 +460,4 @@ uptime=\u00a76Uptime:\u00a7c {0}
antiBuildCraft=\u00a74You are not permitted to create\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
invalidHomeName=\u00a74Invalid home name

View File

@ -457,3 +457,4 @@ uptime=\u00a76Uptime:\u00a7c {0}
antiBuildCraft=\u00a74You are not permitted to create\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
invalidHomeName=\u00a74Invalid home name

View File

@ -230,7 +230,7 @@ nickChanged=Nickname ge\u00e4ndert.
nickDisplayName=\u00a77Du musst \u00a7fchange-displayname\u00a7c in der Essentials-Config aktivieren.
nickInUse=\u00a7cDieser Name wird bereits verwendet.
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.
nickSet=\u00a77Dein Nickname ist nun \u00a7c{0}
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.
antiBuildDrop=\u00a74You are not permitted to drop\u00a7c {0}\u00a74.
gcWorld=\u00a76{0} "\u00a7c{1}\u00a76": \u00a7c{2}\u00a76 chunks, \u00a7c{3}\u00a76 entities
invalidHomeName=\u00a74Invalid home name

View File

@ -457,3 +457,4 @@ uptime=\u00a76Uptime:\u00a7c {0}
antiBuildCraft=\u00a74You are not permitted to create\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
invalidHomeName=\u00a74Invalid home name

View File

@ -457,3 +457,4 @@ uptime=\u00a76Uptime:\u00a7c {0}
antiBuildCraft=\u00a74You are not permitted to create\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
invalidHomeName=\u00a74Invalid home name

View File

@ -457,3 +457,4 @@ uptime=\u00a76Uptime:\u00a7c {0}
antiBuildCraft=\u00a74You are not permitted to create\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
invalidHomeName=\u00a74Invalid home name

View File

@ -457,3 +457,4 @@ uptime=\u00a76Uptime:\u00a7c {0}
antiBuildCraft=\u00a74You are not permitted to create\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
invalidHomeName=\u00a74Invalid home name

View File

@ -457,3 +457,4 @@ uptime=\u00a76Uptime:\u00a7c {0}
antiBuildCraft=\u00a74You are not permitted to create\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
invalidHomeName=\u00a74Invalid home name

View File

@ -457,3 +457,4 @@ uptime=\u00a76Uptime:\u00a7c {0}
antiBuildCraft=\u00a74You are not permitted to create\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
invalidHomeName=\u00a74Invalid home name

View File

@ -457,3 +457,4 @@ uptime=\u00a76Uptime:\u00a7c {0}
antiBuildCraft=\u00a74You are not permitted to create\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
invalidHomeName=\u00a74Invalid home name

View File

@ -457,3 +457,4 @@ uptime=\u00a76Uptime:\u00a7c {0}
antiBuildCraft=\u00a74You are not permitted to create\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
invalidHomeName=\u00a74Invalid home name

View File

@ -457,3 +457,4 @@ uptime=\u00a76Uptime:\u00a7c {0}
antiBuildCraft=\u00a74You are not permitted to create\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
invalidHomeName=\u00a74Invalid home name

View File

@ -198,4 +198,6 @@ v 2.0:
- Give a better error when a subgroup is null.
- Include the GM version when logging errors.
- 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.

View File

@ -1654,7 +1654,7 @@ public class GroupManager extends JavaPlugin {
try {
worldsHolder.saveChanges(forced);
sender.sendMessage(ChatColor.YELLOW + " All changes were saved.");
sender.sendMessage(ChatColor.YELLOW + "All changes were saved.");
} catch (IllegalStateException ex) {
sender.sendMessage(ChatColor.RED + ex.getMessage());
}

View File

@ -69,7 +69,7 @@ public class GroupsDataHolder {
}
/**
* @param groups the groups to set
* Resets the Groups
*/
public void resetGroups() {
this.groups.clear();

View File

@ -52,7 +52,7 @@ public class UsersDataHolder {
}
/**
* @param users the users to set
* Resets the Users
*/
public void resetUsers() {
this.users.clear();

View File

@ -15,8 +15,10 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeSet;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.anjocaido.groupmanager.GroupManager;
@ -37,9 +39,9 @@ import org.yaml.snakeyaml.constructor.SafeConstructor;
import org.yaml.snakeyaml.reader.UnicodeReader;
/**
* One instance of this should exist per world/mirror
* it contains all functions to manage these data sets
* and points to the relevant users and groups objects.
* One instance of this should exist per world/mirror it contains all functions
* to manage these data sets and points to the relevant users and groups
* objects.
*
* @author gabrielcouto, ElgarL
*/
@ -100,8 +102,8 @@ public class WorldDataHolder {
}
/**
* Search for a user. If it doesn't exist, create a new one with
* default group.
* Search for a user. If it doesn't exist, create a new one with default
* group.
*
* @param userName the name of the user
* @return class that manage that user permission
@ -207,8 +209,8 @@ public class WorldDataHolder {
}
/**
* Check if a group exists.
* Its the same of getGroup, but check if it is null.
* Check if a group exists. Its the same of getGroup, but check if it is
* null.
*
* @param groupName the name of the group
* @return true if exists. false if not.
@ -272,8 +274,7 @@ public class WorldDataHolder {
}
/**
* Creates a new User with the given name
* and adds it to this holder.
* Creates a new User with the given name and adds it to this holder.
*
* @param userName the username you want
* @return null if user already exists. or new User
@ -291,8 +292,7 @@ public class WorldDataHolder {
}
/**
* Creates a new Group with the given name
* and adds it to this holder
* Creates a new Group with the given name and adds it to this holder
*
* @param groupName the groupname you want
* @return null if group already exists. or new Group
@ -319,7 +319,8 @@ public class WorldDataHolder {
* @return a collection of the groups
*/
public Collection<Group> getGroupList() {
synchronized(getGroups()) {
synchronized (getGroups()) {
return new ArrayList<Group>(getGroups().values());
}
}
@ -329,7 +330,8 @@ public class WorldDataHolder {
* @return a collection of the users
*/
public Collection<User> getUserList() {
synchronized(getUsers()) {
synchronized (getUsers()) {
return new ArrayList<User>(getUsers().values());
}
}
@ -510,7 +512,7 @@ public class WorldDataHolder {
} catch (Exception ex) {
throw new IllegalArgumentException("Your " + groupsFile.getPath() + " file is invalid. See console for details.", ex);
}
if (allGroupsNode == null) {
throw new IllegalArgumentException("You have no groups in " + groupsFile.getPath() + ".");
}
@ -520,8 +522,7 @@ public class WorldDataHolder {
Integer groupCount = 0;
/*
* loop each group entry
* and process it's data.
* loop each group entry and process it's data.
*/
while (groupItr.hasNext()) {
@ -545,8 +546,7 @@ public class WorldDataHolder {
}
/*
* Create a new group with this name
* in the assigned data source.
* Create a new group with this name in the assigned data source.
*/
Group thisGrp = ph.createGroup(groupKey);
@ -569,8 +569,8 @@ public class WorldDataHolder {
*/
} else if ((Boolean.parseBoolean(nodeData.toString()))) {
/*
* Set this as the default group.
* Warn if some other group has already claimed that position.
* Set this as the default group. Warn if some other group has
* already claimed that position.
*/
if (ph.getDefaultGroup() != null) {
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 no permissions node is found, or it's empty
* do nothing.
* If no permissions node is found, or it's empty do nothing.
*/
} else {
/*
@ -677,8 +676,8 @@ public class WorldDataHolder {
if (nodeData == null || nodeData instanceof List) {
if (nodeData == null) {
/*
* If no inheritance node is found, or it's empty
* do nothing.
* If no inheritance node is found, or it's empty do
* nothing.
*/
} else if (nodeData instanceof List) {
@ -790,10 +789,10 @@ public class WorldDataHolder {
// Attempt to fetch the next user name.
node = usersItr.next();
if (node instanceof Integer)
usersKey = Integer.toString((Integer)node);
usersKey = Integer.toString((Integer) node);
else
usersKey = node.toString();
} catch (Exception 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 no permissions node is found, or it's empty
* do nothing.
* If no permissions node is found, or it's empty do
* nothing.
*/
} else {
if (nodeData instanceof List) {
@ -858,8 +857,7 @@ public class WorldDataHolder {
if (nodeData == null) {
/*
* If no subgroups node is found, or it's empty
* do nothing.
* If no subgroups node is found, or it's empty do nothing.
*/
} else if (nodeData instanceof List) {
for (Object o : ((List) nodeData)) {
@ -894,8 +892,7 @@ public class WorldDataHolder {
if (nodeData == null) {
/*
* If no info node is found, or it's empty
* do nothing.
* If no info node is found, or it's empty do nothing.
*/
} else if (nodeData instanceof Map) {
thisUser.setVariables((Map<String, Object>) nodeData);
@ -946,29 +943,29 @@ public class WorldDataHolder {
Map<String, Object> groupsMap = new HashMap<String, Object>();
root.put("groups", groupsMap);
synchronized(ph.getGroups()) {
for (String groupKey : ph.getGroups().keySet()) {
Group group = ph.getGroups().get(groupKey);
synchronized (ph.getGroups()) {
for (String groupKey : ph.getGroups().keySet()) {
Group group = ph.getGroups().get(groupKey);
Map<String, Object> aGroupMap = new HashMap<String, Object>();
groupsMap.put(group.getName(), aGroupMap);
Map<String, Object> aGroupMap = new HashMap<String, Object>();
groupsMap.put(group.getName(), aGroupMap);
if (ph.getDefaultGroup() == null) {
GroupManager.logger.severe("There is no default group for world: " + ph.getName());
if (ph.getDefaultGroup() == null) {
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()) {
@ -1008,18 +1005,9 @@ public class WorldDataHolder {
GroupManagerEventHandler.callEvent(GMSystemEvent.Action.SAVED);
/*
* FileWriter tx = null;
* try {
* tx = new FileWriter(groupsFile, false);
* tx.write(yaml.dump(root));
* tx.flush();
* } catch (Exception e) {
* } finally {
* try {
* tx.close();
* } catch (IOException ex) {
* }
* }
* FileWriter tx = null; try { tx = new FileWriter(groupsFile, false);
* 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) {
Map<String, Object> root = new HashMap<String, Object>();
Map<String, Object> usersMap = new HashMap<String, Object>();
LinkedHashMap<String, Object> usersMap = new LinkedHashMap<String, Object>();
root.put("users", usersMap);
synchronized(ph.getUsers()) {
for (String userKey : ph.getUsers().keySet()) {
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));
synchronized (ph.getUsers()) {
// A sorted list of users.
for (String userKey : new TreeSet<String>(ph.getUsers().keySet())) {
User user = ph.getUsers().get(userKey);
if ((user.getGroup() == null || user.getGroup().equals(ph.getDefaultGroup())) && user.getPermissionList().isEmpty() && user.getVariables().isEmpty() && user.isSubGroupsEmpty()) {
continue;
}
}
// END USER INFO NODE - BETA
aUserMap.put("permissions", user.getPermissionList());
// SUBGROUPS NODE - BETA
aUserMap.put("subgroups", user.subGroupListStringCopy());
// END SUBGROUPS NODE - BETA
}
LinkedHashMap<String, Object> aUserMap = new LinkedHashMap<String, Object>();
usersMap.put(user.getName(), aUserMap);
// 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()) {
@ -1090,32 +1084,20 @@ public class WorldDataHolder {
GroupManagerEventHandler.callEvent(GMSystemEvent.Action.SAVED);
/*
* FileWriter tx = null;
* try {
* tx = new FileWriter(usersFile, false);
* tx.write(yaml.dump(root));
* tx.flush();
* } catch (Exception e) {
* } finally {
* try {
* tx.close();
* } catch (IOException ex) {
* }
* }
* FileWriter tx = null; try { tx = new FileWriter(usersFile, false);
* 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
* original Nijikokun Permissions
* This method is supposed to make the original one reload the file, and
* propagate the changes made here.
* original Nijikokun Permissions This method is supposed to make the
* original one reload the file, and propagate the changes made here.
*
* Prefer to use the AnjoCaido's fake version of Nijikokun's Permission
* plugin.
* The AnjoCaido's Permission can propagate the changes made on this plugin
* instantly,
* without need to save the file.
* plugin. The AnjoCaido's Permission can propagate the changes made on this
* plugin instantly, without need to save the file.
*
* @param server the server that holds the plugin
* @deprecated it is not used anymore... unless if you use original
@ -1165,13 +1147,13 @@ public class WorldDataHolder {
if (users.HaveUsersChanged()) {
return true;
}
synchronized(users.getUsers()) {
for (User u : users.getUsers().values()) {
if (u.isChanged()) {
return true;
synchronized (users.getUsers()) {
for (User u : users.getUsers().values()) {
if (u.isChanged()) {
return true;
}
}
}
}
return false;
}
@ -1192,13 +1174,13 @@ public class WorldDataHolder {
if (groups.HaveGroupsChanged()) {
return true;
}
synchronized(groups.getGroups()) {
for (Group g : groups.getGroups().values()) {
if (g.isChanged()) {
return true;
synchronized (groups.getGroups()) {
for (Group g : groups.getGroups().values()) {
if (g.isChanged()) {
return true;
}
}
}
}
return false;
}
@ -1208,10 +1190,10 @@ public class WorldDataHolder {
public void removeUsersChangedFlag() {
setUsersChanged(false);
synchronized(getUsers()) {
for (User u : getUsers().values()) {
u.flagAsSaved();
}
synchronized (getUsers()) {
for (User u : getUsers().values()) {
u.flagAsSaved();
}
}
}
@ -1221,10 +1203,10 @@ public class WorldDataHolder {
public void removeGroupsChangedFlag() {
setGroupsChanged(false);
synchronized(getGroups()) {
for (Group g : getGroups().values()) {
g.flagAsSaved();
}
synchronized (getGroups()) {
for (Group g : getGroups().values()) {
g.flagAsSaved();
}
}
}
@ -1281,11 +1263,13 @@ public class WorldDataHolder {
* Resets Users
*/
public void resetUsers() {
users.resetUsers();
}
/**
* Note: Iteration over this object has to be synchronized!
*
* @return the groups
*/
public Map<String, Group> getGroups() {
@ -1295,6 +1279,7 @@ public class WorldDataHolder {
/**
* Note: Iteration over this object has to be synchronized!
*
* @return the users
*/
public Map<String, User> getUsers() {

View File

@ -1,15 +1,15 @@
# "For a more advanced configuration example utilizing the advanced features of GroupManager, see http://pastebin.com/a8ZA0j5G"
users:
snowleo:
subgroups: []
permissions: []
group: Builder
subgroups: []
permissions: []
KHobbits:
group: Moderator
subgroups: []
permissions: []
group: Moderator
ElgarL:
group: Moderator
subgroups: []
permissions: []
group: Moderator