diff --git a/Essentials/src/com/earth2me/essentials/EssentialsBlockListener.java b/Essentials/src/com/earth2me/essentials/EssentialsBlockListener.java index 7cd15180b..72c308655 100644 --- a/Essentials/src/com/earth2me/essentials/EssentialsBlockListener.java +++ b/Essentials/src/com/earth2me/essentials/EssentialsBlockListener.java @@ -1,6 +1,7 @@ package com.earth2me.essentials; import java.util.logging.Logger; +import org.bukkit.GameMode; import org.bukkit.Material; import org.bukkit.event.block.BlockListener; import org.bukkit.event.block.BlockPlaceEvent; @@ -93,7 +94,7 @@ public class EssentialsBlockListener extends BlockListener return; } boolean unlimitedForUser = user.hasUnlimited(is); - if (unlimitedForUser) + if (unlimitedForUser && user.getGameMode() == GameMode.SURVIVAL) { ess.scheduleSyncDelayedTask( new Runnable() diff --git a/Essentials/src/com/earth2me/essentials/EssentialsEntityListener.java b/Essentials/src/com/earth2me/essentials/EssentialsEntityListener.java index 2eda73540..f5d6cec48 100644 --- a/Essentials/src/com/earth2me/essentials/EssentialsEntityListener.java +++ b/Essentials/src/com/earth2me/essentials/EssentialsEntityListener.java @@ -84,10 +84,12 @@ public class EssentialsEntityListener extends EntityListener @Override public void onFoodLevelChange(FoodLevelChangeEvent event) - { + { if (event.getEntity() instanceof Player && ess.getUser(event.getEntity()).isGodModeEnabled()) - { + { + //TODO: Remove the following line, when we're happy to remove backwards compatability with 1185. event.setFoodLevel(20); + event.setCancelled(true); } } } diff --git a/Essentials/src/com/earth2me/essentials/EssentialsPlayerListener.java b/Essentials/src/com/earth2me/essentials/EssentialsPlayerListener.java index 2f690910f..ddf0a6806 100644 --- a/Essentials/src/com/earth2me/essentials/EssentialsPlayerListener.java +++ b/Essentials/src/com/earth2me/essentials/EssentialsPlayerListener.java @@ -46,11 +46,11 @@ public class EssentialsPlayerListener extends PlayerListener public void onPlayerRespawn(final PlayerRespawnEvent event) { final User user = ess.getUser(event.getPlayer()); - user.setDisplayName(user.getNick()); + user.setDisplayNick(user.getNick()); updateCompass(user); if (ess.getSettings().changeDisplayName()) { - user.setDisplayName(user.getNick()); + user.setDisplayNick(user.getNick()); } } @@ -76,7 +76,7 @@ public class EssentialsPlayerListener extends PlayerListener user.updateActivity(true); if (ess.getSettings().changeDisplayName()) { - user.setDisplayName(user.getNick()); + user.setDisplayNick(user.getNick()); } } @@ -262,7 +262,7 @@ public class EssentialsPlayerListener extends PlayerListener if (ess.getSettings().changeDisplayName()) { - user.setDisplayName(user.getNick()); + user.setDisplayNick(user.getNick()); } user.updateActivity(false); if (user.isAuthorized("essentials.sleepingignored")) @@ -351,7 +351,7 @@ public class EssentialsPlayerListener extends PlayerListener final User user = ess.getUser(event.getPlayer()); if (ess.getSettings().changeDisplayName()) { - user.setDisplayName(user.getNick()); + user.setDisplayNick(user.getNick()); } updateCompass(user); } diff --git a/Essentials/src/com/earth2me/essentials/FakeWorld.java b/Essentials/src/com/earth2me/essentials/FakeWorld.java index 8894e8df1..0b5d68be1 100644 --- a/Essentials/src/com/earth2me/essentials/FakeWorld.java +++ b/Essentials/src/com/earth2me/essentials/FakeWorld.java @@ -5,6 +5,7 @@ import java.util.UUID; import org.bukkit.BlockChangeDelegate; import org.bukkit.Chunk; import org.bukkit.ChunkSnapshot; +import org.bukkit.Difficulty; import org.bukkit.Effect; import org.bukkit.Location; import org.bukkit.TreeType; @@ -437,4 +438,21 @@ public class FakeWorld implements World throw new UnsupportedOperationException("Not supported yet."); } + @Override + public Difficulty getDifficulty() + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void setDifficulty(Difficulty difficulty) + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public int getSeaLevel() + { + throw new UnsupportedOperationException("Not supported yet."); + } } diff --git a/Essentials/src/com/earth2me/essentials/ISettings.java b/Essentials/src/com/earth2me/essentials/ISettings.java index 82c057648..af95e2cbc 100644 --- a/Essentials/src/com/earth2me/essentials/ISettings.java +++ b/Essentials/src/com/earth2me/essentials/ISettings.java @@ -73,7 +73,11 @@ public interface ISettings extends IConf boolean getRespawnAtHome(); - int getMultipleHomes(); + List getMultipleHomes(); + + int getHomeLimit(String set); + + int getHomeLimit(User user); boolean getSortListByGroups(); diff --git a/Essentials/src/com/earth2me/essentials/Mob.java b/Essentials/src/com/earth2me/essentials/Mob.java index df4a5b72f..d937ba0fb 100644 --- a/Essentials/src/com/earth2me/essentials/Mob.java +++ b/Essentials/src/com/earth2me/essentials/Mob.java @@ -26,11 +26,10 @@ public enum Mob SPIDER("Spider", Enemies.ENEMY, CreatureType.SPIDER), SQUID("Squid", Enemies.FRIENDLY, CreatureType.SQUID), ZOMBIE("Zombie", Enemies.ENEMY, CreatureType.ZOMBIE), - MONSTER("Monster", Enemies.ENEMY, CreatureType.MONSTER), WOLF("Wolf", Enemies.NEUTRAL, CreatureType.WOLF), CAVESPIDER("CaveSpider", Enemies.ENEMY, CreatureType.CAVE_SPIDER), - ENDERMAN("Enderman", Enemies.ENEMY, CreatureType.ENDERMAN), - SILVERFISH("Silverfish", Enemies.ENEMY, CreatureType.SILVERFISH); + ENDERMAN("Enderman", Enemies.ENEMY, "", CreatureType.ENDERMAN), + SILVERFISH("Silverfish", Enemies.ENEMY, "", CreatureType.SILVERFISH); public static final Logger logger = Logger.getLogger("Minecraft"); diff --git a/Essentials/src/com/earth2me/essentials/OfflinePlayer.java b/Essentials/src/com/earth2me/essentials/OfflinePlayer.java index 07092d0bb..1b0058f24 100644 --- a/Essentials/src/com/earth2me/essentials/OfflinePlayer.java +++ b/Essentials/src/com/earth2me/essentials/OfflinePlayer.java @@ -695,7 +695,7 @@ public class OfflinePlayer implements Player { throw new UnsupportedOperationException("Not supported yet."); } - + @Override public Location getBedSpawnLocation() { @@ -713,5 +713,16 @@ public class OfflinePlayer implements Player { throw new UnsupportedOperationException("Not supported yet."); } - + + @Override + public void setPlayerListName(String name) + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public String getPlayerListName() + { + throw new UnsupportedOperationException("Not supported yet."); + } } diff --git a/Essentials/src/com/earth2me/essentials/PlayerWrapper.java b/Essentials/src/com/earth2me/essentials/PlayerWrapper.java index 2b6dd92ad..4b998af47 100644 --- a/Essentials/src/com/earth2me/essentials/PlayerWrapper.java +++ b/Essentials/src/com/earth2me/essentials/PlayerWrapper.java @@ -744,4 +744,16 @@ public class PlayerWrapper implements Player base.setSprinting(bln); } + @Override + public void setPlayerListName(String name) + { + base.setPlayerListName(name); + } + + @Override + public String getPlayerListName() + { + return base.getPlayerListName(); + } + } diff --git a/Essentials/src/com/earth2me/essentials/Settings.java b/Essentials/src/com/earth2me/essentials/Settings.java index 5bcbd7311..3c06fb300 100644 --- a/Essentials/src/com/earth2me/essentials/Settings.java +++ b/Essentials/src/com/earth2me/essentials/Settings.java @@ -30,12 +30,6 @@ public class Settings implements ISettings { return config.getBoolean("respawn-at-home", false); } - - @Override - public int getMultipleHomes() - { - return config.getInt("multiple-homes", 5); - } @Override public boolean getBedSetsHome() @@ -43,6 +37,40 @@ public class Settings implements ISettings return config.getBoolean("bed-sethome", false); } + @Override + public List getMultipleHomes() + { + return config.getKeys("sethome-multiple"); + } + + @Override + public int getHomeLimit(final User user) + { + final List homeList = getMultipleHomes(); + if (homeList == null) + { + //TODO: Replace this code to remove backwards compat, after settings are automatically updated + // return getHomeLimit("default"); + return config.getInt("multiple-homes", 5); + } + int limit = getHomeLimit("default"); + for (String set : homeList) + { + logger.log(Level.INFO, "Found home set: " + set); + if (user.hasPermission("essentials.sethome.multiple." + set) && limit < getHomeLimit(set)) + { + limit = getHomeLimit(set); + } + } + return limit; + } + + @Override + public int getHomeLimit(final String set) + { + return config.getInt("sethome-multiple." + set, config.getInt("sethome-multiple.default", 3)); + } + @Override public int getChatRadius() { @@ -60,7 +88,7 @@ public class Settings implements ISettings { return config.getInt("default-stack-size", 64); } - + @Override public int getStartingBalance() { @@ -84,7 +112,10 @@ public class Settings implements ISettings { for (String c : config.getStringList("disabled-commands", new ArrayList(0))) { - if (!c.equalsIgnoreCase(label)) continue; + if (!c.equalsIgnoreCase(label)) + { + continue; + } return true; } return config.getBoolean("disable-" + label.toLowerCase(), false); @@ -101,18 +132,24 @@ public class Settings implements ISettings { for (String c : config.getStringList("restricted-commands", new ArrayList(0))) { - if (!c.equalsIgnoreCase(label)) continue; + if (!c.equalsIgnoreCase(label)) + { + continue; + } return true; } return config.getBoolean("restrict-" + label.toLowerCase(), false); } - + @Override public boolean isPlayerCommand(String label) { for (String c : config.getStringList("player-commands", new ArrayList(0))) { - if (!c.equalsIgnoreCase(label)) continue; + if (!c.equalsIgnoreCase(label)) + { + continue; + } return true; } return false; @@ -126,7 +163,9 @@ public class Settings implements ISettings for (String c : config.getStringList("overridden-commands", defaultList)) { if (!c.equalsIgnoreCase(name)) + { continue; + } return true; } return config.getBoolean("override-" + name.toLowerCase(), false); @@ -143,7 +182,9 @@ public class Settings implements ISettings { double cost = config.getDouble("command-costs." + label, 0.0); if (cost == 0.0) + { cost = config.getDouble("cost-" + label, 0.0); + } return cost; } @@ -171,13 +212,14 @@ public class Settings implements ISettings Map kits = (Map)config.getProperty("kits"); for (Map.Entry entry : kits.entrySet()) { - if (entry.getKey().equalsIgnoreCase(name.replace('.', '_').replace('/', '_'))) { + if (entry.getKey().equalsIgnoreCase(name.replace('.', '_').replace('/', '_'))) + { return entry.getValue(); } } return null; } - + @Override public Map getKits() { @@ -190,9 +232,13 @@ public class Settings implements ISettings String colorName = config.getString("ops-name-color", null); if (colorName == null) + { return ChatColor.RED; - if("none".equalsIgnoreCase(colorName) || colorName.isEmpty()) + } + if ("none".equalsIgnoreCase(colorName) || colorName.isEmpty()) + { throw new Exception(); + } try { @@ -228,18 +274,18 @@ public class Settings implements ISettings { return config.getInt("spawnmob-limit", 10); } - + @Override public boolean showNonEssCommandsInHelp() { return config.getBoolean("non-ess-in-help", true); } - + @Override - public boolean hidePermissionlessHelp() + public boolean hidePermissionlessHelp() { return config.getBoolean("hide-permissionless-help", true); - } + } @Override public int getProtectCreeperMaxHeight() @@ -301,12 +347,13 @@ public class Settings implements ISettings { return config.getString("newbies.spawnpoint", "default"); } + @Override - public boolean getPerWarpPermission() + public boolean getPerWarpPermission() { return config.getBoolean("per-warp-permission", false); } - + @Override public boolean getSortListByGroups() { @@ -314,7 +361,8 @@ public class Settings implements ISettings } @Override - public void reloadConfig() { + public void reloadConfig() + { config.load(); } @@ -322,16 +370,21 @@ public class Settings implements ISettings public List itemSpawnBlacklist() { final List epItemSpwn = new ArrayList(); - for (String itemName : config.getString("item-spawn-blacklist", "").split(",")) { + for (String itemName : config.getString("item-spawn-blacklist", "").split(",")) + { itemName = itemName.trim(); - if (itemName.isEmpty()) { + if (itemName.isEmpty()) + { continue; } ItemStack is; - try { + try + { is = ess.getItemDb().get(itemName); epItemSpwn.add(is.getTypeId()); - } catch (Exception ex) { + } + catch (Exception ex) + { logger.log(Level.SEVERE, Util.format("unknownItemInList", itemName, "item-spawn-blacklist")); } } @@ -355,16 +408,17 @@ public class Settings implements ISettings { return config.getBoolean("nether.use-1to1-ratio", false); } - + @Override public double getNetherRatio() { - if (config.getBoolean("nether.use-1to1-ratio", false)) { + if (config.getBoolean("nether.use-1to1-ratio", false)) + { return 1.0; } return config.getDouble("nether.ratio", 8.0); } - + @Override public boolean isDebug() { @@ -374,9 +428,9 @@ public class Settings implements ISettings @Override public boolean warnOnSmite() { - return config.getBoolean("warn-on-smite" ,true); + return config.getBoolean("warn-on-smite", true); } - + @Override public boolean permissionBasedItemSpawn() { @@ -410,23 +464,28 @@ public class Settings implements ISettings @Override public boolean getProtectPreventSpawn(final String creatureName) { - return config.getBoolean("protect.prevent.spawn."+creatureName, false); + return config.getBoolean("protect.prevent.spawn." + creatureName, false); } @Override public List getProtectList(final String configName) { final List list = new ArrayList(); - for (String itemName : config.getString(configName, "").split(",")) { + for (String itemName : config.getString(configName, "").split(",")) + { itemName = itemName.trim(); - if (itemName.isEmpty()) { + if (itemName.isEmpty()) + { continue; } ItemStack itemStack; - try { + try + { itemStack = ess.getItemDb().get(itemName); list.add(itemStack.getTypeId()); - } catch (Exception ex) { + } + catch (Exception ex) + { logger.log(Level.SEVERE, Util.format("unknownItemInList", itemName, configName)); } } @@ -444,12 +503,13 @@ public class Settings implements ISettings { return config.getBoolean(configName, def); } - private final static double MAXMONEY = 10000000000000.0; + public double getMaxMoney() { double max = config.getDouble("max-money", MAXMONEY); - if (Math.abs(max) > MAXMONEY) { + if (Math.abs(max) > MAXMONEY) + { max = max < 0 ? -MAXMONEY : MAXMONEY; } return max; @@ -459,7 +519,7 @@ public class Settings implements ISettings { return config.getBoolean("economy-log-enabled", false); } - + public boolean removeGodOnDisconnect() { return config.getBoolean("remove-god-on-disconnect", false); diff --git a/Essentials/src/com/earth2me/essentials/TargetBlock.java b/Essentials/src/com/earth2me/essentials/TargetBlock.java index d1f2e5cbb..3d45afc55 100644 --- a/Essentials/src/com/earth2me/essentials/TargetBlock.java +++ b/Essentials/src/com/earth2me/essentials/TargetBlock.java @@ -10,6 +10,7 @@ import org.bukkit.entity.Player; /** * Original authors: toi & Raphfrk */ +@Deprecated public class TargetBlock { private transient final Location location; diff --git a/Essentials/src/com/earth2me/essentials/User.java b/Essentials/src/com/earth2me/essentials/User.java index 3b57f48fd..fe811e50f 100644 --- a/Essentials/src/com/earth2me/essentials/User.java +++ b/Essentials/src/com/earth2me/essentials/User.java @@ -20,14 +20,12 @@ public class User extends UserData implements Comparable, IReplyTo, IUser private transient long lastOnlineActivity; private transient long lastActivity = System.currentTimeMillis(); private boolean hidden = false; - private transient boolean godStateBeforeAfk; private transient Location afkPosition; User(final Player base, final IEssentials ess) { super(base, ess); teleport = new Teleport(this, ess); - godStateBeforeAfk = isGodModeEnabled(); afkPosition = getLocation(); } @@ -284,6 +282,12 @@ public class User extends UserData implements Comparable, IReplyTo, IUser return nickname.toString(); } + + public void setDisplayNick(String name) + { + setDisplayName(name); + setPlayerListName(name); + } public Teleport getTeleport() { @@ -348,15 +352,6 @@ public class User extends UserData implements Comparable, IReplyTo, IUser public void setAfk(final boolean set) { this.setSleepingIgnored(this.isAuthorized("essentials.sleepingignored") ? true : set); - if (set && !isAfk() && ess.getSettings().getFreezeAfkPlayers()) - { - godStateBeforeAfk = isGodModeEnabled(); - setGodModeEnabled(true); - } - if (!set && isAfk() && ess.getSettings().getFreezeAfkPlayers()) - { - setGodModeEnabled(godStateBeforeAfk); - } if (set && !isAfk()) { afkPosition = getLocation(); } @@ -460,7 +455,7 @@ public class User extends UserData implements Comparable, IReplyTo, IUser } } final long autoafk = ess.getSettings().getAutoAfk(); - if (!isAfk() && autoafk > 0 && lastActivity + autoafk * 1000 < System.currentTimeMillis()) + if (!isAfk() && autoafk > 0 && lastActivity + autoafk * 1000 < System.currentTimeMillis() && isAuthorized("essentials.afk")) { setAfk(true); if (!isHidden()) { @@ -481,5 +476,11 @@ public class User extends UserData implements Comparable, IReplyTo, IUser setFoodLevel(20); } return super.toggleGodModeEnabled(); - } + } + + @Override + public boolean isGodModeEnabled() + { + return super.isGodModeEnabled() || (isAfk() && ess.getSettings().getFreezeAfkPlayers()); + } } diff --git a/Essentials/src/com/earth2me/essentials/UserData.java b/Essentials/src/com/earth2me/essentials/UserData.java index 39cebbd2a..f0a461b70 100644 --- a/Essentials/src/com/earth2me/essentials/UserData.java +++ b/Essentials/src/com/earth2me/essentials/UserData.java @@ -58,6 +58,7 @@ public abstract class UserData extends PlayerExtension implements IConf isSocialSpyEnabled = _isSocialSpyEnabled(); isNPC = _isNPC(); arePowerToolsEnabled = _arePowerToolsEnabled(); + kitTimestamps = _getKitTimestamps(); } private double money; @@ -163,7 +164,12 @@ public abstract class UserData extends PlayerExtension implements IConf public void delHome(String name) throws Exception { - if (getHome(name) != null) + String search = name; + if (!homes.containsKey(search)) + { + search = Util.sanitizeFileName(name); + } + if (homes.containsKey(search)) { homes.remove(name); config.removeProperty("homes." + name); @@ -243,12 +249,13 @@ public abstract class UserData extends PlayerExtension implements IConf } - public void clearAllPowertools() { + public void clearAllPowertools() + { powertools.clear(); config.setProperty("powertools", powertools); config.save(); } - + public List getPowertool(ItemStack stack) { return (List)powertools.get(stack.getTypeId()); @@ -267,12 +274,11 @@ public abstract class UserData extends PlayerExtension implements IConf config.setProperty("powertools", powertools); config.save(); } - + public boolean hasPowerTools() { return powertools.size() > 0; } - private Location lastLocation; private Location _getLastLocation() @@ -294,6 +300,10 @@ public abstract class UserData extends PlayerExtension implements IConf public void setLastLocation(Location loc) { + if (loc == null || loc.getWorld() == null) + { + return; + } lastLocation = loc; config.setProperty("lastlocation", loc); config.save(); @@ -781,31 +791,57 @@ public abstract class UserData extends PlayerExtension implements IConf config.setProperty("npc", set); config.save(); } - private boolean arePowerToolsEnabled; - + public boolean arePowerToolsEnabled() { return arePowerToolsEnabled; } - + public void setPowerToolsEnabled(boolean set) { arePowerToolsEnabled = set; config.setProperty("powertoolsenabled", set); config.save(); } - + public boolean togglePowerToolsEnabled() { boolean ret = !arePowerToolsEnabled(); setPowerToolsEnabled(ret); return ret; } - + private boolean _arePowerToolsEnabled() { return config.getBoolean("powertoolsenabled", true); } - + private Map kitTimestamps; + + private Map _getKitTimestamps() + { + final Object map = config.getProperty("timestamps.kits"); + + if (map instanceof Map) + { + return (Map)map; + } + else + { + return new HashMap(); + } + } + + public Long getKitTimestamp(final String name) + { + final Number num = (Number)kitTimestamps.get(name.toLowerCase()); + return num == null ? null : num.longValue(); + } + + public void setKitTimestamp(final String name, final long time) + { + kitTimestamps.put(name.toLowerCase(), time); + config.setProperty("timestamps.kits", kitTimestamps); + config.save(); + } } diff --git a/Essentials/src/com/earth2me/essentials/Util.java b/Essentials/src/com/earth2me/essentials/Util.java index 7d0093680..c1b0ed7bf 100644 --- a/Essentials/src/com/earth2me/essentials/Util.java +++ b/Essentials/src/com/earth2me/essentials/Util.java @@ -227,30 +227,36 @@ public class Util AIR_MATERIALS.add(Material.SAPLING.getId()); AIR_MATERIALS.add(Material.POWERED_RAIL.getId()); AIR_MATERIALS.add(Material.DETECTOR_RAIL.getId()); + AIR_MATERIALS.add(Material.LONG_GRASS.getId()); AIR_MATERIALS.add(Material.DEAD_BUSH.getId()); - AIR_MATERIALS.add(Material.RAILS.getId()); AIR_MATERIALS.add(Material.YELLOW_FLOWER.getId()); AIR_MATERIALS.add(Material.RED_ROSE.getId()); - AIR_MATERIALS.add(Material.RED_MUSHROOM.getId()); AIR_MATERIALS.add(Material.BROWN_MUSHROOM.getId()); + AIR_MATERIALS.add(Material.RED_MUSHROOM.getId()); + AIR_MATERIALS.add(Material.TORCH.getId()); + AIR_MATERIALS.add(Material.REDSTONE_WIRE.getId()); AIR_MATERIALS.add(Material.SEEDS.getId()); AIR_MATERIALS.add(Material.SIGN_POST.getId()); - AIR_MATERIALS.add(Material.WALL_SIGN.getId()); + AIR_MATERIALS.add(Material.WOODEN_DOOR.getId()); AIR_MATERIALS.add(Material.LADDER.getId()); - AIR_MATERIALS.add(Material.SUGAR_CANE_BLOCK.getId()); - AIR_MATERIALS.add(Material.REDSTONE_WIRE.getId()); + AIR_MATERIALS.add(Material.RAILS.getId()); + AIR_MATERIALS.add(Material.WALL_SIGN.getId()); + AIR_MATERIALS.add(Material.LEVER.getId()); + AIR_MATERIALS.add(Material.STONE_PLATE.getId()); + AIR_MATERIALS.add(Material.IRON_DOOR_BLOCK.getId()); + AIR_MATERIALS.add(Material.WOOD_PLATE.getId()); AIR_MATERIALS.add(Material.REDSTONE_TORCH_OFF.getId()); AIR_MATERIALS.add(Material.REDSTONE_TORCH_ON.getId()); - AIR_MATERIALS.add(Material.TORCH.getId()); - AIR_MATERIALS.add(Material.SOIL.getId()); - AIR_MATERIALS.add(Material.DIODE_BLOCK_OFF.getId()); - AIR_MATERIALS.add(Material.DIODE_BLOCK_ON.getId()); - AIR_MATERIALS.add(Material.TRAP_DOOR.getId()); AIR_MATERIALS.add(Material.STONE_BUTTON.getId()); - AIR_MATERIALS.add(Material.STONE_PLATE.getId()); - AIR_MATERIALS.add(Material.WOOD_PLATE.getId()); - AIR_MATERIALS.add(Material.IRON_DOOR_BLOCK.getId()); - AIR_MATERIALS.add(Material.WOODEN_DOOR.getId()); + AIR_MATERIALS.add(Material.SUGAR_CANE_BLOCK.getId()); + AIR_MATERIALS.add(Material.DIODE_BLOCK_OFF.getId()); + AIR_MATERIALS.add(Material.DIODE_BLOCK_ON.getId()); + AIR_MATERIALS.add(Material.TRAP_DOOR.getId()); + AIR_MATERIALS.add(Material.PUMPKIN_STEM.getId()); + AIR_MATERIALS.add(Material.MELON_STEM.getId()); + AIR_MATERIALS.add(Material.VINE.getId()); + //TODO: Add 1.9 materials + } public static Location getSafeDestination(final Location loc) throws Exception @@ -260,9 +266,9 @@ public class Util throw new Exception(Util.i18n("destinationNotSet")); } final World world = loc.getWorld(); - int x = (int)Math.round(loc.getX()); + int x = loc.getBlockX(); int y = (int)Math.round(loc.getY()); - int z = (int)Math.round(loc.getZ()); + int z = loc.getBlockZ(); while (isBlockAboveAir(world, x, y, z)) { diff --git a/Essentials/src/com/earth2me/essentials/commands/Commanddelhome.java b/Essentials/src/com/earth2me/essentials/commands/Commanddelhome.java index aa60c9168..1d80b6a17 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commanddelhome.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commanddelhome.java @@ -31,7 +31,7 @@ public class Commanddelhome extends EssentialsCommand } else if (args.length > 1 && (user == null || user.isAuthorized("essentials.delhome.others"))) { - user = getPlayer(server, args, 0); + user = getPlayer(server, args, 0, true); name = args[1]; } else diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandheal.java b/Essentials/src/com/earth2me/essentials/commands/Commandheal.java index d60fc09fe..68de488af 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandheal.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandheal.java @@ -34,6 +34,7 @@ public class Commandheal extends EssentialsCommand user.healCooldown(); } user.setHealth(20); + user.setFoodLevel(20); user.sendMessage(Util.i18n("heal")); } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandkit.java b/Essentials/src/com/earth2me/essentials/commands/Commandkit.java index 75cc83887..ae7963c5e 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandkit.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandkit.java @@ -15,22 +15,20 @@ import org.bukkit.inventory.ItemStack; public class Commandkit extends EssentialsCommand { - static private final Map> kitPlayers = new HashMap>(); - public Commandkit() { super("kit"); } @Override - public void run(Server server, User user, String commandLabel, String[] args) throws Exception + public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception { if (args.length < 1) { try { - Map kits = ess.getSettings().getKits(); - StringBuilder list = new StringBuilder(); + final Map kits = ess.getSettings().getKits(); + final StringBuilder list = new StringBuilder(); for (String k : kits.keySet()) { if (user.isAuthorized("essentials.kit." + k.toLowerCase())) @@ -56,8 +54,8 @@ public class Commandkit extends EssentialsCommand { try { - String kitName = args[0].toLowerCase(); - Object kit = ess.getSettings().getKit(kitName); + final String kitName = args[0].toLowerCase(); + final Object kit = ess.getSettings().getKit(kitName); List items; if (!user.isAuthorized("essentials.kit." + kitName)) @@ -70,39 +68,26 @@ public class Commandkit extends EssentialsCommand { //System.out.println("Kit is timed"); - Map els = (Map)kit; + final Map els = (Map)kit; items = (List)els.get("items"); - double delay = els.containsKey("delay") ? ((Number)els.get("delay")).doubleValue() : 0L; - Calendar c = new GregorianCalendar(); - c.add(Calendar.SECOND, (int)delay); - c.add(Calendar.MILLISECOND, (int)((delay*1000.0)%1000.0)); + final double delay = els.containsKey("delay") ? ((Number)els.get("delay")).doubleValue() : 0L; + final Calendar c = new GregorianCalendar(); + c.add(Calendar.SECOND, -(int)delay); + c.add(Calendar.MILLISECOND, -(int)((delay*1000.0)%1000.0)); - long time = c.getTimeInMillis(); - Calendar now = new GregorianCalendar(); - - Map kitTimes; - if (!kitPlayers.containsKey(user)) - { - kitTimes = new HashMap(); - kitTimes.put(kitName, time); - kitPlayers.put(user, kitTimes); - } - else - { - kitTimes = kitPlayers.get(user); - if (!kitTimes.containsKey(kitName)) - { - kitTimes.put(kitName, time); - } - else if (kitTimes.get(kitName) < now.getTimeInMillis()) - { - kitTimes.put(kitName, time); - } - else - { - user.sendMessage(Util.format("kitTimed", Util.formatDateDiff(kitTimes.get(kitName)))); - return; - } + final long mintime = c.getTimeInMillis(); + + final Long lastTime = user.getKitTimestamp(kitName); + if (lastTime == null || lastTime < mintime) { + final Calendar now = new GregorianCalendar(); + user.setKitTimestamp(kitName, now.getTimeInMillis()); + } else { + final Calendar future = new GregorianCalendar(); + future.setTimeInMillis(lastTime); + future.add(Calendar.SECOND, (int)delay); + future.add(Calendar.MILLISECOND, (int)((delay*1000.0)%1000.0)); + user.sendMessage(Util.format("kitTimed", Util.formatDateDiff(future.getTimeInMillis()))); + return; } } catch (Exception ex) @@ -110,7 +95,7 @@ public class Commandkit extends EssentialsCommand items = (List)kit; } - Trade charge = new Trade("kit-" + kitName, ess); + final Trade charge = new Trade("kit-" + kitName, ess); try { charge.isAffordableFor(user); @@ -124,11 +109,11 @@ public class Commandkit extends EssentialsCommand boolean spew = false; for (String d : items) { - String[] parts = d.split("[^0-9]+", 3); - int id = Material.getMaterial(Integer.parseInt(parts[0])).getId(); - int amount = parts.length > 1 ? Integer.parseInt(parts[parts.length > 2 ? 2 : 1]) : 1; - short data = parts.length > 2 ? Short.parseShort(parts[1]) : 0; - HashMap overfilled = user.getInventory().addItem(new ItemStack(id, amount, data)); + final String[] parts = d.split("[^0-9]+", 3); + final int id = Material.getMaterial(Integer.parseInt(parts[0])).getId(); + final int amount = parts.length > 1 ? Integer.parseInt(parts[parts.length > 2 ? 2 : 1]) : 1; + final short data = parts.length > 2 ? Short.parseShort(parts[1]) : 0; + final HashMap overfilled = user.getInventory().addItem(new ItemStack(id, amount, data)); for (ItemStack itemStack : overfilled.values()) { user.getWorld().dropItemNaturally(user.getLocation(), itemStack); diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandmail.java b/Essentials/src/com/earth2me/essentials/commands/Commandmail.java index e08a6c8e5..acffd57a1 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandmail.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandmail.java @@ -23,13 +23,15 @@ public class Commandmail extends EssentialsCommand List mail = user.getMails(); if (mail.isEmpty()) { - throw new Exception(Util.i18n("noMail")); + user.sendMessage(Util.i18n("noMail")); + throw new NoChargeException(); } for (String s : mail) { user.sendMessage(s); } - throw new Exception(Util.i18n("mailClear")); + user.sendMessage(Util.i18n("mailClear")); + return; } if (args.length >= 3 && "send".equalsIgnoreCase(args[0])) { @@ -62,8 +64,9 @@ public class Commandmail extends EssentialsCommand if (args.length >= 1 && "clear".equalsIgnoreCase(args[0])) { user.setMails(null); - throw new Exception(Util.i18n("mailCleared")); + user.sendMessage(Util.i18n("mailCleared")); + return; } - throw new NoChargeException(); + throw new NotEnoughArgumentsException(); } } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandnick.java b/Essentials/src/com/earth2me/essentials/commands/Commandnick.java index 253ec7646..f2165aebc 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandnick.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandnick.java @@ -41,7 +41,7 @@ public class Commandnick extends EssentialsCommand String nick = args[0]; if ("off".equalsIgnoreCase(nick) || user.getName().equalsIgnoreCase(nick)) { - user.setDisplayName(user.getName()); + user.setDisplayNick(user.getName()); user.setNickname(null); user.sendMessage(Util.i18n("nickNoMore")); return; @@ -67,7 +67,7 @@ public class Commandnick extends EssentialsCommand } } - user.setDisplayName(ess.getSettings().getNicknamePrefix() + nick); + user.setDisplayNick(ess.getSettings().getNicknamePrefix() + nick); user.setNickname(nick); user.sendMessage(Util.format("nickSet", user.getDisplayName() + "§7.")); } @@ -95,13 +95,13 @@ public class Commandnick extends EssentialsCommand String nick = args[1]; if ("off".equalsIgnoreCase(nick) || target.getName().equalsIgnoreCase(nick)) { - target.setDisplayName(target.getName()); + target.setDisplayNick(target.getName()); target.setNickname(null); target.sendMessage(Util.i18n("nickNoMore")); } else { - target.setDisplayName(ess.getSettings().getNicknamePrefix() + nick); + target.setDisplayNick(ess.getSettings().getNicknamePrefix() + nick); target.setNickname(nick); target.sendMessage(Util.format("nickSet", target.getDisplayName() + "§7.")); } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandsethome.java b/Essentials/src/com/earth2me/essentials/commands/Commandsethome.java index 82d66a71c..b59984f05 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandsethome.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandsethome.java @@ -28,14 +28,14 @@ public class Commandsethome extends EssentialsCommand { if (user.isAuthorized("essentials.sethome.multiple")) { - if ((user.isAuthorized("essentials.sethome.multiple.unlimited")) || (user.getHomes().size() < ess.getSettings().getMultipleHomes()) + if ((user.isAuthorized("essentials.sethome.multiple.unlimited")) || (user.getHomes().size() < ess.getSettings().getHomeLimit(user)) || (user.getHomes().contains(args[0].toLowerCase()))) { user.setHome(args[0].toLowerCase()); } else { - throw new Exception(Util.format("maxHomes", ess.getSettings().getMultipleHomes())); + throw new Exception(Util.format("maxHomes", ess.getSettings().getHomeLimit(user))); } } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandspawnmob.java b/Essentials/src/com/earth2me/essentials/commands/Commandspawnmob.java index f46264582..3ea3aae40 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandspawnmob.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandspawnmob.java @@ -56,11 +56,6 @@ public class Commandspawnmob extends EssentialsCommand } } - if (ess.getSettings().getProtectPreventSpawn(mobType.toLowerCase()) - || (mountType != null && ess.getSettings().getProtectPreventSpawn(mountType.toLowerCase()))) - { - throw new Exception(Util.i18n("unableToSpawnMob")); - } Entity spawnedMob = null; Mob mob = null; @@ -72,6 +67,12 @@ public class Commandspawnmob extends EssentialsCommand { throw new Exception(Util.i18n("invalidMob")); } + + if (ess.getSettings().getProtectPreventSpawn(mob.getType().toString().toLowerCase())) + { + throw new Exception(Util.i18n("unableToSpawnMob")); + } + int[] ignore = { 8, 9 @@ -79,8 +80,7 @@ public class Commandspawnmob extends EssentialsCommand Block block = (new TargetBlock(user, 300, 0.2, ignore)).getTargetBlock(); if (block == null) { - user.sendMessage(Util.i18n("unableToSpawnMob")); - return; + throw new Exception(Util.i18n("unableToSpawnMob")); } Location loc = block.getLocation(); Location sloc = Util.getSafeDestination(loc); @@ -90,8 +90,7 @@ public class Commandspawnmob extends EssentialsCommand } catch (MobException e) { - user.sendMessage(Util.i18n("unableToSpawnMob")); - return; + throw new Exception(Util.i18n("unableToSpawnMob")); } if (mountType != null) @@ -102,14 +101,18 @@ public class Commandspawnmob extends EssentialsCommand user.sendMessage(Util.i18n("invalidMob")); return; } + + if (ess.getSettings().getProtectPreventSpawn(mobMount.getType().toString().toLowerCase())) + { + throw new Exception(Util.i18n("unableToSpawnMob")); + } try { spawnedMount = mobMount.spawn(user, server, loc); } catch (MobException e) { - user.sendMessage(Util.i18n("unableToSpawnMob")); - return; + throw new Exception(Util.i18n("unableToSpawnMob")); } spawnedMob.setPassenger(spawnedMount); } @@ -144,8 +147,7 @@ public class Commandspawnmob extends EssentialsCommand } catch (MobException e) { - user.sendMessage(Util.i18n("unableToSpawnMob")); - return; + throw new Exception(Util.i18n("unableToSpawnMob")); } spawnedMob.setPassenger(spawnedMount); } diff --git a/Essentials/src/config.yml b/Essentials/src/config.yml index ee956b0fc..7b1525d40 100644 --- a/Essentials/src/config.yml +++ b/Essentials/src/config.yml @@ -92,6 +92,7 @@ spawnmob-limit: 10 warn-on-smite: true # The message of the day, displayed on connect and by typing /motd. +# Valid tags are: {PLAYER}, {IP}, {BALANCE}, {MAILS}, {WORLD}, {ONLINE}, {UNIQUE}, {PLAYERLIST} motd: - '&cWelcome, {PLAYER}&c!' - '&fType &c/help&f for a list of commands.' @@ -259,10 +260,16 @@ bed-sethome: false # If no home is set send you to spawn when /home is used spawn-if-no-home: false -# If users have essentials.sethome.multiple how many homes can they have -# People with essentials.sethome.multiple.unlimited are not limited by this number -multiple-homes: 5 - +# Allow players to have multiple homes. +# Define different amounts of multiple homes for different permissions, e.g. essentials.sethome.multiple.vip +# People with essentials.sethome.multiple.unlimited are not limited by these numbers. +sethome-multiple: + # essentials.sethome.multiple + default: 3 + # essentials.sethome.multiple.vip + vip: 5 + # essentials.sethome.multiple.staff + staff: 10 ############################################################ # +------------------------------------------------------+ # @@ -485,7 +492,7 @@ protect: use: true # Should we tell people they are not allowed to build - warn-on-build-disallow: false + warn-on-build-disallow: true # Disable weather options diff --git a/Essentials/src/plugin.yml b/Essentials/src/plugin.yml index 0c5f689a7..61a054c45 100644 --- a/Essentials/src/plugin.yml +++ b/Essentials/src/plugin.yml @@ -293,7 +293,7 @@ commands: togglejail: description: Prevents a player from interacting with the world and teleports him/her to the the jail specified usage: / [player] [jailname] - aliases: [tjail,etogglejail] + aliases: [tjail,unjail,eunjail,etogglejail] top: description: Teleport to the highest block at your current position. usage: / diff --git a/Essentials/test/com/earth2me/essentials/FakeServer.java b/Essentials/test/com/earth2me/essentials/FakeServer.java index ac5636c61..2344c4513 100644 --- a/Essentials/test/com/earth2me/essentials/FakeServer.java +++ b/Essentials/test/com/earth2me/essentials/FakeServer.java @@ -1,6 +1,7 @@ package com.earth2me.essentials; import com.avaje.ebean.config.ServerConfig; +import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -14,7 +15,9 @@ import org.bukkit.Location; import org.bukkit.Server; import org.bukkit.World; import org.bukkit.World.Environment; +import org.bukkit.WorldCreator; import org.bukkit.command.CommandSender; +import org.bukkit.command.ConsoleCommandSender; import org.bukkit.command.PluginCommand; import org.bukkit.entity.Player; import org.bukkit.generator.ChunkGenerator; @@ -43,41 +46,48 @@ public class FakeServer implements Server return "1.0"; } + @Override public Player[] getOnlinePlayers() { return players.toArray(new Player[0]); } - + public void setOnlinePlayers(List players) { this.players = players; } + @Override public int getMaxPlayers() { return 100; } + @Override public int getPort() { return 25565; } + @Override public String getIp() { return "127.0.0.1"; } + @Override public String getServerName() { return "Test Server"; } + @Override public String getServerId() { return "Test Server"; } + @Override public int broadcastMessage(String string) { int i = 0; @@ -89,11 +99,19 @@ public class FakeServer implements Server return i; } + @Override public String getUpdateFolder() { return "update"; } + @Override + public File getUpdateFolderFile() + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override public Player getPlayer(String string) { for (Player player : players) @@ -106,6 +124,7 @@ public class FakeServer implements Server return null; } + @Override public List matchPlayer(String string) { List matches = new ArrayList(); @@ -119,15 +138,17 @@ public class FakeServer implements Server return matches; } + @Override public PluginManager getPluginManager() { throw new UnsupportedOperationException("Not supported yet."); } + @Override public BukkitScheduler getScheduler() { - return new BukkitScheduler() { - + return new BukkitScheduler() + { @Override public int scheduleSyncDelayedTask(Plugin plugin, Runnable r, long l) { @@ -215,16 +236,19 @@ public class FakeServer implements Server }; } + @Override public ServicesManager getServicesManager() { throw new UnsupportedOperationException("Not supported yet."); } + @Override public List getWorlds() { return worlds; } + @Override public World createWorld(String string, Environment e) { World w = new FakeWorld(string, e); @@ -232,6 +256,7 @@ public class FakeServer implements Server return w; } + @Override public World createWorld(String string, Environment e, long l) { World w = new FakeWorld(string, e); @@ -239,45 +264,54 @@ public class FakeServer implements Server return w; } + @Override public World getWorld(String string) { for (World world : worlds) { - if (world.getName().equalsIgnoreCase(string)) { + if (world.getName().equalsIgnoreCase(string)) + { return world; } } return null; } + @Override public void reload() { } + @Override public Logger getLogger() { return Logger.getLogger("Minecraft"); } + @Override public PluginCommand getPluginCommand(String string) { throw new UnsupportedOperationException("Not supported yet."); } + @Override public void savePlayers() { } + @Override public boolean dispatchCommand(CommandSender cs, String string) { throw new UnsupportedOperationException("Not supported yet."); } + @Override public void configureDbConfig(ServerConfig sc) { throw new UnsupportedOperationException("Not supported yet."); } + @Override public boolean addRecipe(Recipe recipe) { throw new UnsupportedOperationException("Not supported yet."); @@ -287,7 +321,7 @@ public class FakeServer implements Server { players.add(base1); } - + public OfflinePlayer createPlayer(String name, IEssentials ess) { OfflinePlayer player = new OfflinePlayer(name, ess); @@ -295,41 +329,55 @@ public class FakeServer implements Server return player; } + @Override public World createWorld(String string, Environment e, ChunkGenerator cg) { throw new UnsupportedOperationException("Not supported yet."); } + @Override public World createWorld(String string, Environment e, long l, ChunkGenerator cg) { throw new UnsupportedOperationException("Not supported yet."); } + @Override + public World createWorld(WorldCreator creator) + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override public boolean unloadWorld(String string, boolean bln) { throw new UnsupportedOperationException("Not supported yet."); } + @Override public boolean unloadWorld(World world, boolean bln) { throw new UnsupportedOperationException("Not supported yet."); } + @Override public Map getCommandAliases() { throw new UnsupportedOperationException("Not supported yet."); } + @Override public int getSpawnRadius() { throw new UnsupportedOperationException("Not supported yet."); } + @Override public void setSpawnRadius(int i) { throw new UnsupportedOperationException("Not supported yet."); } + @Override public boolean getOnlineMode() { throw new UnsupportedOperationException("Not supported yet."); @@ -340,6 +388,7 @@ public class FakeServer implements Server throw new UnsupportedOperationException("Not supported yet."); } + @Override public World getWorld(UUID uuid) { throw new UnsupportedOperationException("Not supported yet."); @@ -454,7 +503,19 @@ public class FakeServer implements Server } @Override - public void setDefaultGameMode(GameMode gm) + public void setDefaultGameMode(GameMode gamemode) + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public ConsoleCommandSender getConsoleSender() + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Set getOperators() { throw new UnsupportedOperationException("Not supported yet."); } diff --git a/EssentialsGroupManager/src/Changelog.txt b/EssentialsGroupManager/src/Changelog.txt index 47c0457a7..b8034e19c 100644 --- a/EssentialsGroupManager/src/Changelog.txt +++ b/EssentialsGroupManager/src/Changelog.txt @@ -22,4 +22,17 @@ v 1.1: - Added a BukkitPermsUpdateTask to only update superperms once on a load/reload. - Fix for GM not checking inheritance for known superperms nodes. - Optimized getAllPlayersPermissions and fixed pushing unknown perms to superperms. -v 1.2: \ No newline at end of file +v 1.2: + - Changed priority of Registered events to lowest. + - Fixed an issue with superperms where plugins define perms with inheritance after the root perms + - Rewrote Config loading to use Bukkits Configuration features + - Added an opOverride setting in config. + If present and set to false, op's will not get overriding permissions in GroupManager. + (one op will not be able to alter another op's settings) + - GM will now create all relevant world data files for non mirrored worlds. + (for all worlds named in config.yml) + - Attempt to stop GM wiping groups/users yml's on a bad shut down. + - Added event handling to manage new world creation at runtime. + - Added the ability to handle unknown worlds at server start. + (GM will create the data files for any worlds it finds which are not in the config.yml) + - Fix for Bukkit passing a null To location on a player Portaling \ No newline at end of file diff --git a/EssentialsGroupManager/src/config.yml b/EssentialsGroupManager/src/config.yml index 688d3f3ea..a5bca810e 100644 --- a/EssentialsGroupManager/src/config.yml +++ b/EssentialsGroupManager/src/config.yml @@ -1,12 +1,19 @@ settings: + config: + # With this enabled anyone set as op has full permissions when managing GroupManager + opOverrides: true data: save: + # How often GroupManager will save it's data back to groups and users.yml minutes: 10 logging: + # level of detail GroupManager will use when logging. + # Acceptable entries are - ALL,CONFIG,FINE,FINER,FINEST,INFO,OFF,SEVERE,WARNING level: INFO permission: world: mirror: + # Worlds listed here have their permissions mirrored in their children. world: - world_nether - world2 diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/GMConfiguration.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/GMConfiguration.java old mode 100755 new mode 100644 index 153221ed9..aa838d9e8 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/GMConfiguration.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/GMConfiguration.java @@ -5,15 +5,12 @@ package org.anjocaido.groupmanager; import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; import java.io.IOException; import java.util.Map; import java.util.logging.Level; + import org.anjocaido.groupmanager.utils.Tasks; -import org.yaml.snakeyaml.Yaml; -import org.yaml.snakeyaml.constructor.SafeConstructor; -import org.yaml.snakeyaml.reader.UnicodeReader; +import org.bukkit.util.config.Configuration; /** * @@ -22,9 +19,9 @@ import org.yaml.snakeyaml.reader.UnicodeReader; public class GMConfiguration { private GroupManager plugin; - private Map rootDataNode; private File configFile; - + private Configuration GMconfig; + public GMConfiguration(GroupManager plugin) { this.plugin = plugin; load(); @@ -44,77 +41,37 @@ public class GMConfiguration { } } - Yaml yaml = new Yaml(new SafeConstructor()); - FileInputStream rx = null; + GMconfig = new Configuration(configFile); + try { - rx = new FileInputStream(configFile); - } catch (FileNotFoundException ex) { - GroupManager.logger.log(Level.SEVERE, null, ex); - } - try { - rootDataNode = (Map) yaml.load(new UnicodeReader(rx)); - if (rootDataNode == null) { - throw new NullPointerException(); - } + GMconfig.load(); } catch (Exception ex) { throw new IllegalArgumentException("The following file couldn't pass on Parser.\n" + configFile.getPath(), ex); - } finally { - try { - rx.close(); - } catch (IOException ex) { - } } adjustLoggerLevel(); } - - public Map getMirrorsMap() { - if (rootDataNode.get("settings") instanceof Map) { - Map settingsNode = (Map) rootDataNode.get("settings"); - if (settingsNode.get("permission") instanceof Map) { - Map permissionNode = (Map) settingsNode.get("permission"); - if (permissionNode.get("world") instanceof Map) { - Map worldsNode = (Map) permissionNode.get("world"); - if (worldsNode.get("mirror") instanceof Map) { - Map mirrorsNode = (Map) worldsNode.get("mirror"); - return mirrorsNode; - } - } - } - } - return null; + + public boolean isOpOverride() { + return GMconfig.getBoolean("settings.config.opOverrides", true); } - public Integer getSaveInterval() { - if (rootDataNode.get("settings") instanceof Map) { - Map settingsNode = (Map) rootDataNode.get("settings"); - if (settingsNode.get("data") instanceof Map) { - Map dataNode = (Map) settingsNode.get("data"); - if (dataNode.get("save") instanceof Map) { - Map saveNode = (Map) dataNode.get("save"); - if (saveNode.get("minutes") instanceof Integer) { - return (Integer) saveNode.get("minutes"); - } - } - } - } - return 10; + @SuppressWarnings("unchecked") + public Map getMirrorsMap() { + return (Map) GMconfig.getProperty("settings.permission.world.mirror"); + } + + public Integer getSaveInterval() { + return GMconfig.getInt("settings.data.save.minutes", 10); } public void adjustLoggerLevel() { - if (rootDataNode.get("settings") instanceof Map) { - Map settingsNode = (Map) rootDataNode.get("settings"); - if (settingsNode.get("logging") instanceof Map) { - Map loggingNode = (Map) settingsNode.get("logging"); - if (loggingNode.get("level") instanceof String) { - String level = (String) loggingNode.get("level"); - try { - GroupManager.logger.setLevel(Level.parse(level)); - return; - } catch (Exception e) { - } - } - } + + try { + GroupManager.logger.setLevel(Level.parse(GMconfig.getString("settings.logging.level", "INFO"))); + return; + } catch (Exception e) { } - GroupManager.logger.setLevel(Level.INFO); + + GroupManager.logger.setLevel(Level.INFO); } } \ No newline at end of file diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java index dcec36639..0fe8a15d4 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java @@ -24,6 +24,7 @@ import java.util.concurrent.TimeUnit; import java.util.logging.Level; import java.util.logging.Logger; import org.anjocaido.groupmanager.dataholder.worlds.WorldsHolder; +import org.anjocaido.groupmanager.events.GMWorldListener; import org.anjocaido.groupmanager.utils.GMLoggerHandler; import org.anjocaido.groupmanager.utils.PermissionCheckResult; import org.anjocaido.groupmanager.utils.Tasks; @@ -32,9 +33,12 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.command.ConsoleCommandSender; import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.world.WorldListener; import org.bukkit.plugin.PluginDescriptionFile; import org.bukkit.plugin.java.JavaPlugin; + @SuppressWarnings("unused") /** * @@ -55,6 +59,7 @@ public class GroupManager extends JavaPlugin { private GMConfiguration config; private GMLoggerHandler ch; public static BukkitPermissions BukkitPermissions; + private static WorldListener WorldEvents; public static final Logger logger = Logger.getLogger(GroupManager.class.getName()); //PERMISSIONS FOR COMMAND BEING LOADED @@ -69,6 +74,10 @@ public class GroupManager extends JavaPlugin { worldsHolder.saveChanges(); } disableScheduler(); + + WorldEvents = null; + BukkitPermissions = null; + // EXAMPLE: Custom code, here we just output some info so we can check all is well PluginDescriptionFile pdfFile = this.getDescription(); System.out.println(pdfFile.getName() + " version " + pdfFile.getVersion() + " is disabled!"); @@ -94,8 +103,10 @@ public class GroupManager extends JavaPlugin { throw new IllegalStateException("An error ocurred while loading GroupManager"); } + // Initialize the world listener and bukkit permissions to handle events. + WorldEvents = new GMWorldListener(this); BukkitPermissions = new BukkitPermissions(this); - + enableScheduler(); /* @@ -108,9 +119,10 @@ public class GroupManager extends JavaPlugin { setLoaded(true); } - //setLoaded(true); System.out.println(pdfFile.getName() + " version " + pdfFile.getVersion() + " is enabled!"); } + + public static boolean isLoaded() { return isLoaded; @@ -232,6 +244,7 @@ public class GroupManager extends JavaPlugin { Player senderPlayer = null, targetPlayer = null; Group senderGroup = null; User senderUser = null; + boolean isOpOverride = config.isOpOverride(); //DETERMINING PLAYER INFORMATION @@ -239,8 +252,10 @@ public class GroupManager extends JavaPlugin { senderPlayer = (Player) sender; senderUser = worldsHolder.getWorldData(senderPlayer).getUser(senderPlayer.getName()); senderGroup = senderUser.getGroup(); + isOpOverride = (isOpOverride && senderPlayer.isOp()); + System.out.println("[PLAYER_COMMAND] " + senderPlayer.getName() + ": /" + commandLabel + " " + Tasks.join(args, " ")); - if (senderPlayer.isOp() || worldsHolder.getWorldPermissions(senderPlayer).has(senderPlayer, "groupmanager." + cmd.getName())) { + if (isOpOverride || worldsHolder.getWorldPermissions(senderPlayer).has(senderPlayer, "groupmanager." + cmd.getName())) { playerCanDo = true; } } else if (sender instanceof ConsoleCommandSender) { @@ -338,27 +353,19 @@ public class GroupManager extends JavaPlugin { } //VALIDANDO PERMISSAO - if (!isConsole && !senderPlayer.isOp() && (senderGroup != null ? permissionHandler.inGroup(auxUser.getName(), senderGroup.getName()) : false)) { + if (!isConsole && !isOpOverride && (senderGroup != null ? permissionHandler.inGroup(auxUser.getName(), senderGroup.getName()) : false)) { sender.sendMessage(ChatColor.RED + "Can't modify player with same permissions than you, or higher."); return false; } - if (!isConsole && !senderPlayer.isOp() && (permissionHandler.hasGroupInInheritance(auxGroup, senderGroup.getName()))) { + if (!isConsole && !isOpOverride && (permissionHandler.hasGroupInInheritance(auxGroup, senderGroup.getName()))) { sender.sendMessage(ChatColor.RED + "The destination group can't be the same as yours, or higher."); return false; } - if (!isConsole && !senderPlayer.isOp() && (!permissionHandler.inGroup(senderUser.getName(), auxUser.getGroupName()) || !permissionHandler.inGroup(senderUser.getName(), auxGroup.getName()))) { + if (!isConsole && !isOpOverride && (!permissionHandler.inGroup(senderUser.getName(), auxUser.getGroupName()) || !permissionHandler.inGroup(senderUser.getName(), auxGroup.getName()))) { sender.sendMessage(ChatColor.RED + "Can't modify player involving a group that you don't inherit."); return false; } - if (!isConsole && !senderPlayer.isOp() && (!permissionHandler.hasGroupInInheritance(auxUser.getGroup(), auxGroup.getName()) && !permissionHandler.hasGroupInInheritance(auxGroup, auxUser.getGroupName()))) { - sender.sendMessage(ChatColor.RED + "Can't modify player using groups with different heritage line."); - return false; - } - if (!isConsole && !senderPlayer.isOp() && (!permissionHandler.hasGroupInInheritance(auxGroup, auxUser.getGroupName()))) { - sender.sendMessage(ChatColor.RED + "The new group must be a higher rank."); - return false; - } - + //PARECE OK auxUser.setGroup(auxGroup); sender.sendMessage(ChatColor.YELLOW + "You changed player '" + auxUser.getName() + "' group to '" + auxGroup.getName() + "'."); @@ -392,7 +399,7 @@ public class GroupManager extends JavaPlugin { auxUser = dataHolder.getUser(args[0]); } //VALIDANDO PERMISSAO - if (!isConsole && !senderPlayer.isOp() && (senderGroup != null ? permissionHandler.inGroup(auxUser.getName(), senderGroup.getName()) : false)) { + if (!isConsole && !isOpOverride && (senderGroup != null ? permissionHandler.inGroup(auxUser.getName(), senderGroup.getName()) : false)) { sender.sendMessage(ChatColor.RED + "Can't modify player with same permissions than you, or higher."); return false; } @@ -436,7 +443,7 @@ public class GroupManager extends JavaPlugin { return false; } //VALIDANDO PERMISSAO - if (!isConsole && !senderPlayer.isOp() && (senderGroup != null ? permissionHandler.inGroup(auxUser.getName(), senderGroup.getName()) : false)) { + if (!isConsole && !isOpOverride && (senderGroup != null ? permissionHandler.inGroup(auxUser.getName(), senderGroup.getName()) : false)) { sender.sendMessage(ChatColor.RED + "Can't modify player with same permissions than you, or higher."); return false; } @@ -472,7 +479,7 @@ public class GroupManager extends JavaPlugin { auxUser = dataHolder.getUser(args[0]); } //VALIDANDO PERMISSAO - if (!isConsole && !senderPlayer.isOp() && (senderGroup != null ? permissionHandler.inGroup(auxUser.getName(), senderGroup.getName()) : false)) { + if (!isConsole && !isOpOverride && (senderGroup != null ? permissionHandler.inGroup(auxUser.getName(), senderGroup.getName()) : false)) { sender.sendMessage(ChatColor.RED + "Can't modify player with same permissions than you, or higher."); return false; } @@ -557,7 +564,7 @@ public class GroupManager extends JavaPlugin { return false; } permissionResult = permissionHandler.checkFullUserPermission(senderUser, args[1]); - if (!isConsole && !senderPlayer.isOp() && (permissionResult.resultType.equals(PermissionCheckResult.Type.NOTFOUND) + if (!isConsole && !isOpOverride && (permissionResult.resultType.equals(PermissionCheckResult.Type.NOTFOUND) || permissionResult.resultType.equals(PermissionCheckResult.Type.NEGATION))) { sender.sendMessage(ChatColor.RED + "Can't add a permission you don't have."); return false; @@ -620,12 +627,12 @@ public class GroupManager extends JavaPlugin { auxUser = dataHolder.getUser(args[0]); } //VALIDANDO SUA PERMISSAO - if (!isConsole && !senderPlayer.isOp() && (senderGroup != null ? permissionHandler.inGroup(auxUser.getName(), senderGroup.getName()) : false)) { + if (!isConsole && !isOpOverride && (senderGroup != null ? permissionHandler.inGroup(auxUser.getName(), senderGroup.getName()) : false)) { sender.sendMessage(ChatColor.RED + "Can't modify player with same group than you, or higher."); return false; } permissionResult = permissionHandler.checkFullUserPermission(senderUser, args[1]); - if (!isConsole && !senderPlayer.isOp() && (permissionResult.resultType.equals(PermissionCheckResult.Type.NOTFOUND) + if (!isConsole && !isOpOverride && (permissionResult.resultType.equals(PermissionCheckResult.Type.NOTFOUND) || permissionResult.resultType.equals(PermissionCheckResult.Type.NEGATION))) { sender.sendMessage(ChatColor.RED + "Can't remove a permission you don't have."); return false; @@ -1554,23 +1561,23 @@ public class GroupManager extends JavaPlugin { return false; } //VALIDANDO PERMISSAO - if (!isConsole && !senderPlayer.isOp() && (senderGroup != null ? permissionHandler.inGroup(auxUser.getName(), senderGroup.getName()) : false)) { + if (!isConsole && !isOpOverride && (senderGroup != null ? permissionHandler.inGroup(auxUser.getName(), senderGroup.getName()) : false)) { sender.sendMessage(ChatColor.RED + "Can't modify player with same permissions than you, or higher."); return false; } - if (!isConsole && !senderPlayer.isOp() && (permissionHandler.hasGroupInInheritance(auxGroup, senderGroup.getName()))) { + if (!isConsole && !isOpOverride && (permissionHandler.hasGroupInInheritance(auxGroup, senderGroup.getName()))) { sender.sendMessage(ChatColor.RED + "The destination group can't be the same as yours, or higher."); return false; } - if (!isConsole && !senderPlayer.isOp() && (!permissionHandler.inGroup(senderUser.getName(), auxUser.getGroupName()) || !permissionHandler.inGroup(senderUser.getName(), auxGroup.getName()))) { + if (!isConsole && !isOpOverride && (!permissionHandler.inGroup(senderUser.getName(), auxUser.getGroupName()) || !permissionHandler.inGroup(senderUser.getName(), auxGroup.getName()))) { sender.sendMessage(ChatColor.RED + "Can't modify player involving a group that you don't inherit."); return false; } - if (!isConsole && !senderPlayer.isOp() && (!permissionHandler.hasGroupInInheritance(auxUser.getGroup(), auxGroup.getName()) && !permissionHandler.hasGroupInInheritance(auxGroup, auxUser.getGroupName()))) { + if (!isConsole && !isOpOverride && (!permissionHandler.hasGroupInInheritance(auxUser.getGroup(), auxGroup.getName()) && !permissionHandler.hasGroupInInheritance(auxGroup, auxUser.getGroupName()))) { sender.sendMessage(ChatColor.RED + "Can't modify player using groups with different heritage line."); return false; } - if (!isConsole && !senderPlayer.isOp() && (!permissionHandler.hasGroupInInheritance(auxGroup, auxUser.getGroupName()))) { + if (!isConsole && !isOpOverride && (!permissionHandler.hasGroupInInheritance(auxGroup, auxUser.getGroupName()))) { sender.sendMessage(ChatColor.RED + "The new group must be a higher rank."); return false; } @@ -1612,23 +1619,23 @@ public class GroupManager extends JavaPlugin { return false; } //VALIDANDO PERMISSAO - if (!isConsole && !senderPlayer.isOp() && (senderGroup != null ? permissionHandler.inGroup(auxUser.getName(), senderGroup.getName()) : false)) { + if (!isConsole && !isOpOverride && (senderGroup != null ? permissionHandler.inGroup(auxUser.getName(), senderGroup.getName()) : false)) { sender.sendMessage(ChatColor.RED + "Can't modify player with same permissions than you, or higher."); return false; } - if (!isConsole && !senderPlayer.isOp() && (permissionHandler.hasGroupInInheritance(auxGroup, senderGroup.getName()))) { + if (!isConsole && !isOpOverride && (permissionHandler.hasGroupInInheritance(auxGroup, senderGroup.getName()))) { sender.sendMessage(ChatColor.RED + "The destination group can't be the same as yours, or higher."); return false; } - if (!isConsole && !senderPlayer.isOp() && (!permissionHandler.inGroup(senderUser.getName(), auxUser.getGroupName()) || !permissionHandler.inGroup(senderUser.getName(), auxGroup.getName()))) { + if (!isConsole && !isOpOverride && (!permissionHandler.inGroup(senderUser.getName(), auxUser.getGroupName()) || !permissionHandler.inGroup(senderUser.getName(), auxGroup.getName()))) { sender.sendMessage(ChatColor.RED + "Can't modify player involving a group that you don' inherit."); return false; } - if (!isConsole && !senderPlayer.isOp() && (!permissionHandler.hasGroupInInheritance(auxUser.getGroup(), auxGroup.getName()) && !permissionHandler.hasGroupInInheritance(auxGroup, auxUser.getGroupName()))) { + if (!isConsole && !isOpOverride && (!permissionHandler.hasGroupInInheritance(auxUser.getGroup(), auxGroup.getName()) && !permissionHandler.hasGroupInInheritance(auxGroup, auxUser.getGroupName()))) { sender.sendMessage(ChatColor.RED + "Can't modify player using groups with different heritage line."); return false; } - if (!isConsole && !senderPlayer.isOp() && (permissionHandler.hasGroupInInheritance(auxGroup, auxUser.getGroupName()))) { + if (!isConsole && !isOpOverride && (permissionHandler.hasGroupInInheritance(auxGroup, auxUser.getGroupName()))) { sender.sendMessage(ChatColor.RED + "The new group must be a lower rank."); return false; } diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/Tasks/BukkitPermsUpdateTask.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/Tasks/BukkitPermsUpdateTask.java index 27951112d..f4b805c35 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/Tasks/BukkitPermsUpdateTask.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/Tasks/BukkitPermsUpdateTask.java @@ -18,6 +18,7 @@ public class BukkitPermsUpdateTask implements Runnable { public void run() { // Signal loaded and update BukkitPermissions. GroupManager.setLoaded(true); + GroupManager.BukkitPermissions.collectPermissions(); GroupManager.BukkitPermissions.updateAllPlayers(); GroupManager.logger.info("Bukkit Permissions Updated!"); diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/WorldDataHolder.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/WorldDataHolder.java index 77d933fa0..4a9f806d8 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/WorldDataHolder.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/WorldDataHolder.java @@ -767,13 +767,15 @@ public class WorldDataHolder { aGroupMap.put("permissions", group.getPermissionList()); } - DumperOptions opt = new DumperOptions(); - opt.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); - final Yaml yaml = new Yaml(opt); - try { - yaml.dump(root, new OutputStreamWriter(new FileOutputStream(groupsFile), "UTF-8")); - } catch (UnsupportedEncodingException ex) { - } catch (FileNotFoundException ex) { + if (!root.isEmpty()) { + DumperOptions opt = new DumperOptions(); + opt.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); + final Yaml yaml = new Yaml(opt); + try { + yaml.dump(root, new OutputStreamWriter(new FileOutputStream(groupsFile), "UTF-8")); + } catch (UnsupportedEncodingException ex) { + } catch (FileNotFoundException ex) { + } } /*FileWriter tx = null; @@ -829,13 +831,16 @@ public class WorldDataHolder { aUserMap.put("subgroups", user.subGroupListStringCopy()); //END SUBGROUPS NODE - BETA } - DumperOptions opt = new DumperOptions(); - opt.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); - final Yaml yaml = new Yaml(opt); - try { - yaml.dump(root, new OutputStreamWriter(new FileOutputStream(usersFile), "UTF-8")); - } catch (UnsupportedEncodingException ex) { - } catch (FileNotFoundException ex) { + + if (!root.isEmpty()) { + DumperOptions opt = new DumperOptions(); + opt.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); + final Yaml yaml = new Yaml(opt); + try { + yaml.dump(root, new OutputStreamWriter(new FileOutputStream(usersFile), "UTF-8")); + } catch (UnsupportedEncodingException ex) { + } catch (FileNotFoundException ex) { + } } /*FileWriter tx = null; try { diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/worlds/WorldsHolder.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/worlds/WorldsHolder.java index a2c34be16..50e6ef547 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/worlds/WorldsHolder.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/worlds/WorldsHolder.java @@ -21,6 +21,7 @@ import org.anjocaido.groupmanager.dataholder.WorldDataHolder; import org.anjocaido.groupmanager.dataholder.OverloadedWorldHolder; import org.anjocaido.groupmanager.permissions.AnjoPermissionsHandler; import org.anjocaido.groupmanager.utils.Tasks; +import org.bukkit.World; import org.bukkit.entity.Player; /** @@ -52,6 +53,7 @@ public class WorldsHolder { */ public WorldsHolder(GroupManager plugin) { this.plugin = plugin; + // Setup folders and check files exist for the primary world verifyFirstRun(); initialLoad(); if (defaultWorld == null) { @@ -60,21 +62,48 @@ public class WorldsHolder { } private void initialLoad() { + // load the initial world initialWorldLoading(); + // Configure and load any mirrors and additional worlds as defined in config.yml mirrorSetUp(); + // search the worlds folder for any manually created worlds (not listed in config.yml) + loadAllSearchedWorlds(); } private void initialWorldLoading() { - //LOAD EVERY WORLD POSSIBLE + //Load the default world loadWorld(serverDefaultWorldName); defaultWorld = worldsData.get(serverDefaultWorldName); - + } + + private void loadAllSearchedWorlds() { + + /* + * Read all known worlds from Bukkit + * Create the data files if they don't already exist, + * and they are not mirrored. + */ + for (World world: plugin.getServer().getWorlds()) + if ((!worldsData.containsKey(world.getName().toLowerCase())) + && (!mirrors.containsKey(world.getName().toLowerCase()))) + setupWorldFolder(world.getName()); + /* + * Loop over all folders within the worlds folder + * and attempt to load the world data + */ for (File folder : worldsFolder.listFiles()) { - if (folder.getName().equalsIgnoreCase(serverDefaultWorldName)) { - continue; - } - if (folder.isDirectory()) { - loadWorld(folder.getName()); + if (folder.isDirectory()) { + GroupManager.logger.info("World Found: " + folder.getName()); + + /* + * don't load any worlds which are already loaded + * or mirrored worlds that don't need data. + */ + if (worldsData.containsKey(folder.getName().toLowerCase()) + || mirrors.containsKey(folder.getName().toLowerCase())) { + continue; + } + loadWorld(folder.getName()); } } } @@ -85,6 +114,12 @@ public class WorldsHolder { Map mirrorsMap = plugin.getConfig().getMirrorsMap(); if (mirrorsMap != null) { for (String source : mirrorsMap.keySet()) { + // Make sure all non mirrored worlds have a set of data files. + setupWorldFolder(source); + // Load the world data + if (!worldsData.containsKey(source.toLowerCase())) + loadWorld(source); + if (mirrorsMap.get(source) instanceof ArrayList) { ArrayList mirrorList = (ArrayList) mirrorsMap.get(source); for (Object o : mirrorList) { @@ -246,18 +281,25 @@ public class WorldsHolder { } private void verifyFirstRun() { + + Properties server = new Properties(); + try { + server.load(new FileInputStream(new File("server.properties"))); + serverDefaultWorldName = server.getProperty("level-name").toLowerCase(); + setupWorldFolder(serverDefaultWorldName); + } catch (IOException ex) { + GroupManager.logger.log(Level.SEVERE, null, ex); + } + + } + + public void setupWorldFolder(String worldName) { worldsFolder = new File(plugin.getDataFolder(), "worlds"); if (!worldsFolder.exists()) { worldsFolder.mkdirs(); } - Properties server = new Properties(); - try { - server.load(new FileInputStream(new File("server.properties"))); - } catch (IOException ex) { - GroupManager.logger.log(Level.SEVERE, null, ex); - } - serverDefaultWorldName = server.getProperty("level-name").toLowerCase(); - File defaultWorldFolder = new File(worldsFolder, serverDefaultWorldName); + + File defaultWorldFolder = new File(worldsFolder, worldName); if (!defaultWorldFolder.exists()) { defaultWorldFolder.mkdirs(); } diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/events/GMWorldListener.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/events/GMWorldListener.java new file mode 100644 index 000000000..037971314 --- /dev/null +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/events/GMWorldListener.java @@ -0,0 +1,43 @@ +package org.anjocaido.groupmanager.events; + +import org.anjocaido.groupmanager.GroupManager; +import org.bukkit.event.Event; +import org.bukkit.event.world.WorldInitEvent; +import org.bukkit.event.world.WorldListener; + + +/** + * @author ElgarL + * + * Handle new world creation from other plugins + * + */ +public class GMWorldListener extends WorldListener { + + private final GroupManager plugin; + + public GMWorldListener(GroupManager instance) { + plugin = instance; + registerEvents(); + } + + private void registerEvents() { + plugin.getServer().getPluginManager().registerEvent(Event.Type.WORLD_INIT, this, Event.Priority.Lowest, plugin); + } + + @Override + public void onWorldInit(WorldInitEvent event) { + String worldName = event.getWorld().getName(); + + if (GroupManager.isLoaded() && !plugin.getWorldsHolder().isInList(worldName)) { + GroupManager.logger.info("New world detected..."); + GroupManager.logger.info("Creating data for: " + worldName); + plugin.getWorldsHolder().setupWorldFolder(worldName); + plugin.getWorldsHolder().loadWorld(worldName); + if (plugin.getWorldsHolder().isInList(worldName)) { + GroupManager.logger.info("Don't forget to configure/mirror this world in config.yml."); + } else + GroupManager.logger.severe("Failed to configure this world."); + } + } +} \ No newline at end of file diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/BukkitPermissions.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/BukkitPermissions.java index affa72c78..19d90854b 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/BukkitPermissions.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/BukkitPermissions.java @@ -43,7 +43,6 @@ import org.bukkit.event.server.ServerListener; import org.bukkit.permissions.Permission; import org.bukkit.permissions.PermissionAttachment; import org.bukkit.permissions.PermissionAttachmentInfo; -//import org.bukkit.permissions.PermissionAttachmentInfo; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.PluginManager; @@ -79,13 +78,13 @@ public class BukkitPermissions { PlayerEvents playerEventListener = new PlayerEvents(); - manager.registerEvent(Event.Type.PLAYER_JOIN, playerEventListener, Event.Priority.Normal, plugin); - manager.registerEvent(Event.Type.PLAYER_KICK, playerEventListener, Event.Priority.Normal, plugin); - manager.registerEvent(Event.Type.PLAYER_QUIT, playerEventListener, Event.Priority.Normal, plugin); + manager.registerEvent(Event.Type.PLAYER_JOIN, playerEventListener, Event.Priority.Lowest, plugin); + manager.registerEvent(Event.Type.PLAYER_KICK, playerEventListener, Event.Priority.Lowest, plugin); + manager.registerEvent(Event.Type.PLAYER_QUIT, playerEventListener, Event.Priority.Lowest, plugin); - manager.registerEvent(Event.Type.PLAYER_RESPAWN, playerEventListener, Event.Priority.Normal, plugin); - manager.registerEvent(Event.Type.PLAYER_TELEPORT, playerEventListener, Event.Priority.Normal, plugin); - manager.registerEvent(Event.Type.PLAYER_PORTAL, playerEventListener, Event.Priority.Normal, plugin); + manager.registerEvent(Event.Type.PLAYER_RESPAWN, playerEventListener, Event.Priority.Lowest, plugin); + manager.registerEvent(Event.Type.PLAYER_TELEPORT, playerEventListener, Event.Priority.Lowest, plugin); + manager.registerEvent(Event.Type.PLAYER_PORTAL, playerEventListener, Event.Priority.Lowest, plugin); ServerListener serverListener = new BukkitEvents(); @@ -93,7 +92,7 @@ public class BukkitPermissions { manager.registerEvent(Event.Type.PLUGIN_DISABLE, serverListener, Event.Priority.Normal, plugin); } - private void collectPermissions() { + public void collectPermissions() { registeredPermissions.clear(); for (Plugin bukkitPlugin : Bukkit.getServer().getPluginManager().getPlugins()) { for(Permission permission : bukkitPlugin.getDescription().getPermissions()) @@ -134,8 +133,8 @@ public class BukkitPermissions { Boolean value; for (Permission permission : registeredPermissions) { value = worldData.getPermissionsHandler().checkUserPermission(user, permission.getName()); - - attachment.setPermission(permission, value); + if (value == true) + attachment.setPermission(permission, value); } // Add any missing permissions for this player (non bukkit plugins) @@ -199,7 +198,7 @@ public class BukkitPermissions { @Override public void onPlayerPortal(PlayerPortalEvent event) { // will portal into another world - if(!event.getFrom().getWorld().equals(event.getTo().getWorld())){ // only if world actually changed + if(event.getTo() != null && !event.getFrom().getWorld().equals(event.getTo().getWorld())){ // only if world actually changed updatePermissions(event.getPlayer(), event.getTo().getWorld().getName()); } } @@ -211,7 +210,7 @@ public class BukkitPermissions { @Override public void onPlayerTeleport(PlayerTeleportEvent event) { // can be teleported into another world - if (!event.getFrom().getWorld().equals(event.getTo().getWorld())) { // only if world actually changed + if (event.getTo() != null && !event.getFrom().getWorld().equals(event.getTo().getWorld())) { // only if world actually changed updatePermissions(event.getPlayer(), event.getTo().getWorld().getName()); } } diff --git a/lib/bPermissions.jar b/lib/bPermissions.jar index 26ddcb970..8fa949ce6 100644 Binary files a/lib/bPermissions.jar and b/lib/bPermissions.jar differ diff --git a/lib/bukkit-0.0.1-SNAPSHOT.jar b/lib/bukkit-0.0.1-SNAPSHOT.jar index 63232deae..b348aa103 100644 Binary files a/lib/bukkit-0.0.1-SNAPSHOT.jar and b/lib/bukkit-0.0.1-SNAPSHOT.jar differ diff --git a/lib/craftbukkit-0.0.1-SNAPSHOT.jar b/lib/craftbukkit-0.0.1-SNAPSHOT.jar index 154265890..5e0ccde38 100644 Binary files a/lib/craftbukkit-0.0.1-SNAPSHOT.jar and b/lib/craftbukkit-0.0.1-SNAPSHOT.jar differ