Merge branch 'essmaster' into essrelease

This commit is contained in:
KHobbits 2011-10-04 09:51:51 +01:00
commit 401498a4f7
35 changed files with 596 additions and 312 deletions

View File

@ -1,6 +1,7 @@
package com.earth2me.essentials; package com.earth2me.essentials;
import java.util.logging.Logger; import java.util.logging.Logger;
import org.bukkit.GameMode;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.event.block.BlockListener; import org.bukkit.event.block.BlockListener;
import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.block.BlockPlaceEvent;
@ -93,7 +94,7 @@ public class EssentialsBlockListener extends BlockListener
return; return;
} }
boolean unlimitedForUser = user.hasUnlimited(is); boolean unlimitedForUser = user.hasUnlimited(is);
if (unlimitedForUser) if (unlimitedForUser && user.getGameMode() == GameMode.SURVIVAL)
{ {
ess.scheduleSyncDelayedTask( ess.scheduleSyncDelayedTask(
new Runnable() new Runnable()

View File

@ -84,10 +84,12 @@ public class EssentialsEntityListener extends EntityListener
@Override @Override
public void onFoodLevelChange(FoodLevelChangeEvent event) public void onFoodLevelChange(FoodLevelChangeEvent event)
{ {
if (event.getEntity() instanceof Player && ess.getUser(event.getEntity()).isGodModeEnabled()) 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.setFoodLevel(20);
event.setCancelled(true);
} }
} }
} }

View File

@ -46,11 +46,11 @@ public class EssentialsPlayerListener extends PlayerListener
public void onPlayerRespawn(final PlayerRespawnEvent event) public void onPlayerRespawn(final PlayerRespawnEvent event)
{ {
final User user = ess.getUser(event.getPlayer()); final User user = ess.getUser(event.getPlayer());
user.setDisplayName(user.getNick()); user.setDisplayNick(user.getNick());
updateCompass(user); updateCompass(user);
if (ess.getSettings().changeDisplayName()) if (ess.getSettings().changeDisplayName())
{ {
user.setDisplayName(user.getNick()); user.setDisplayNick(user.getNick());
} }
} }
@ -76,7 +76,7 @@ public class EssentialsPlayerListener extends PlayerListener
user.updateActivity(true); user.updateActivity(true);
if (ess.getSettings().changeDisplayName()) 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()) if (ess.getSettings().changeDisplayName())
{ {
user.setDisplayName(user.getNick()); user.setDisplayNick(user.getNick());
} }
user.updateActivity(false); user.updateActivity(false);
if (user.isAuthorized("essentials.sleepingignored")) if (user.isAuthorized("essentials.sleepingignored"))
@ -351,7 +351,7 @@ public class EssentialsPlayerListener extends PlayerListener
final User user = ess.getUser(event.getPlayer()); final User user = ess.getUser(event.getPlayer());
if (ess.getSettings().changeDisplayName()) if (ess.getSettings().changeDisplayName())
{ {
user.setDisplayName(user.getNick()); user.setDisplayNick(user.getNick());
} }
updateCompass(user); updateCompass(user);
} }

View File

@ -5,6 +5,7 @@ import java.util.UUID;
import org.bukkit.BlockChangeDelegate; import org.bukkit.BlockChangeDelegate;
import org.bukkit.Chunk; import org.bukkit.Chunk;
import org.bukkit.ChunkSnapshot; import org.bukkit.ChunkSnapshot;
import org.bukkit.Difficulty;
import org.bukkit.Effect; import org.bukkit.Effect;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.TreeType; import org.bukkit.TreeType;
@ -437,4 +438,21 @@ public class FakeWorld implements World
throw new UnsupportedOperationException("Not supported yet."); 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.");
}
} }

View File

@ -73,7 +73,11 @@ public interface ISettings extends IConf
boolean getRespawnAtHome(); boolean getRespawnAtHome();
int getMultipleHomes(); List getMultipleHomes();
int getHomeLimit(String set);
int getHomeLimit(User user);
boolean getSortListByGroups(); boolean getSortListByGroups();

View File

@ -26,11 +26,10 @@ public enum Mob
SPIDER("Spider", Enemies.ENEMY, CreatureType.SPIDER), SPIDER("Spider", Enemies.ENEMY, CreatureType.SPIDER),
SQUID("Squid", Enemies.FRIENDLY, CreatureType.SQUID), SQUID("Squid", Enemies.FRIENDLY, CreatureType.SQUID),
ZOMBIE("Zombie", Enemies.ENEMY, CreatureType.ZOMBIE), ZOMBIE("Zombie", Enemies.ENEMY, CreatureType.ZOMBIE),
MONSTER("Monster", Enemies.ENEMY, CreatureType.MONSTER),
WOLF("Wolf", Enemies.NEUTRAL, CreatureType.WOLF), WOLF("Wolf", Enemies.NEUTRAL, CreatureType.WOLF),
CAVESPIDER("CaveSpider", Enemies.ENEMY, CreatureType.CAVE_SPIDER), CAVESPIDER("CaveSpider", Enemies.ENEMY, CreatureType.CAVE_SPIDER),
ENDERMAN("Enderman", Enemies.ENEMY, CreatureType.ENDERMAN), ENDERMAN("Enderman", Enemies.ENEMY, "", CreatureType.ENDERMAN),
SILVERFISH("Silverfish", Enemies.ENEMY, CreatureType.SILVERFISH); SILVERFISH("Silverfish", Enemies.ENEMY, "", CreatureType.SILVERFISH);
public static final Logger logger = Logger.getLogger("Minecraft"); public static final Logger logger = Logger.getLogger("Minecraft");

View File

@ -695,7 +695,7 @@ public class OfflinePlayer implements Player
{ {
throw new UnsupportedOperationException("Not supported yet."); throw new UnsupportedOperationException("Not supported yet.");
} }
@Override @Override
public Location getBedSpawnLocation() public Location getBedSpawnLocation()
{ {
@ -713,5 +713,16 @@ public class OfflinePlayer implements Player
{ {
throw new UnsupportedOperationException("Not supported yet."); 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.");
}
} }

View File

@ -744,4 +744,16 @@ public class PlayerWrapper implements Player
base.setSprinting(bln); base.setSprinting(bln);
} }
@Override
public void setPlayerListName(String name)
{
base.setPlayerListName(name);
}
@Override
public String getPlayerListName()
{
return base.getPlayerListName();
}
} }

View File

@ -30,12 +30,6 @@ public class Settings implements ISettings
{ {
return config.getBoolean("respawn-at-home", false); return config.getBoolean("respawn-at-home", false);
} }
@Override
public int getMultipleHomes()
{
return config.getInt("multiple-homes", 5);
}
@Override @Override
public boolean getBedSetsHome() public boolean getBedSetsHome()
@ -43,6 +37,40 @@ public class Settings implements ISettings
return config.getBoolean("bed-sethome", false); return config.getBoolean("bed-sethome", false);
} }
@Override
public List<String> getMultipleHomes()
{
return config.getKeys("sethome-multiple");
}
@Override
public int getHomeLimit(final User user)
{
final List<String> 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 @Override
public int getChatRadius() public int getChatRadius()
{ {
@ -60,7 +88,7 @@ public class Settings implements ISettings
{ {
return config.getInt("default-stack-size", 64); return config.getInt("default-stack-size", 64);
} }
@Override @Override
public int getStartingBalance() public int getStartingBalance()
{ {
@ -84,7 +112,10 @@ public class Settings implements ISettings
{ {
for (String c : config.getStringList("disabled-commands", new ArrayList<String>(0))) for (String c : config.getStringList("disabled-commands", new ArrayList<String>(0)))
{ {
if (!c.equalsIgnoreCase(label)) continue; if (!c.equalsIgnoreCase(label))
{
continue;
}
return true; return true;
} }
return config.getBoolean("disable-" + label.toLowerCase(), false); 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<String>(0))) for (String c : config.getStringList("restricted-commands", new ArrayList<String>(0)))
{ {
if (!c.equalsIgnoreCase(label)) continue; if (!c.equalsIgnoreCase(label))
{
continue;
}
return true; return true;
} }
return config.getBoolean("restrict-" + label.toLowerCase(), false); return config.getBoolean("restrict-" + label.toLowerCase(), false);
} }
@Override @Override
public boolean isPlayerCommand(String label) public boolean isPlayerCommand(String label)
{ {
for (String c : config.getStringList("player-commands", new ArrayList<String>(0))) for (String c : config.getStringList("player-commands", new ArrayList<String>(0)))
{ {
if (!c.equalsIgnoreCase(label)) continue; if (!c.equalsIgnoreCase(label))
{
continue;
}
return true; return true;
} }
return false; return false;
@ -126,7 +163,9 @@ public class Settings implements ISettings
for (String c : config.getStringList("overridden-commands", defaultList)) for (String c : config.getStringList("overridden-commands", defaultList))
{ {
if (!c.equalsIgnoreCase(name)) if (!c.equalsIgnoreCase(name))
{
continue; continue;
}
return true; return true;
} }
return config.getBoolean("override-" + name.toLowerCase(), false); 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); double cost = config.getDouble("command-costs." + label, 0.0);
if (cost == 0.0) if (cost == 0.0)
{
cost = config.getDouble("cost-" + label, 0.0); cost = config.getDouble("cost-" + label, 0.0);
}
return cost; return cost;
} }
@ -171,13 +212,14 @@ public class Settings implements ISettings
Map<String, Object> kits = (Map<String, Object>)config.getProperty("kits"); Map<String, Object> kits = (Map<String, Object>)config.getProperty("kits");
for (Map.Entry<String, Object> entry : kits.entrySet()) for (Map.Entry<String, Object> entry : kits.entrySet())
{ {
if (entry.getKey().equalsIgnoreCase(name.replace('.', '_').replace('/', '_'))) { if (entry.getKey().equalsIgnoreCase(name.replace('.', '_').replace('/', '_')))
{
return entry.getValue(); return entry.getValue();
} }
} }
return null; return null;
} }
@Override @Override
public Map<String, Object> getKits() public Map<String, Object> getKits()
{ {
@ -190,9 +232,13 @@ public class Settings implements ISettings
String colorName = config.getString("ops-name-color", null); String colorName = config.getString("ops-name-color", null);
if (colorName == null) if (colorName == null)
{
return ChatColor.RED; return ChatColor.RED;
if("none".equalsIgnoreCase(colorName) || colorName.isEmpty()) }
if ("none".equalsIgnoreCase(colorName) || colorName.isEmpty())
{
throw new Exception(); throw new Exception();
}
try try
{ {
@ -228,18 +274,18 @@ public class Settings implements ISettings
{ {
return config.getInt("spawnmob-limit", 10); return config.getInt("spawnmob-limit", 10);
} }
@Override @Override
public boolean showNonEssCommandsInHelp() public boolean showNonEssCommandsInHelp()
{ {
return config.getBoolean("non-ess-in-help", true); return config.getBoolean("non-ess-in-help", true);
} }
@Override @Override
public boolean hidePermissionlessHelp() public boolean hidePermissionlessHelp()
{ {
return config.getBoolean("hide-permissionless-help", true); return config.getBoolean("hide-permissionless-help", true);
} }
@Override @Override
public int getProtectCreeperMaxHeight() public int getProtectCreeperMaxHeight()
@ -301,12 +347,13 @@ public class Settings implements ISettings
{ {
return config.getString("newbies.spawnpoint", "default"); return config.getString("newbies.spawnpoint", "default");
} }
@Override @Override
public boolean getPerWarpPermission() public boolean getPerWarpPermission()
{ {
return config.getBoolean("per-warp-permission", false); return config.getBoolean("per-warp-permission", false);
} }
@Override @Override
public boolean getSortListByGroups() public boolean getSortListByGroups()
{ {
@ -314,7 +361,8 @@ public class Settings implements ISettings
} }
@Override @Override
public void reloadConfig() { public void reloadConfig()
{
config.load(); config.load();
} }
@ -322,16 +370,21 @@ public class Settings implements ISettings
public List<Integer> itemSpawnBlacklist() public List<Integer> itemSpawnBlacklist()
{ {
final List<Integer> epItemSpwn = new ArrayList<Integer>(); final List<Integer> epItemSpwn = new ArrayList<Integer>();
for (String itemName : config.getString("item-spawn-blacklist", "").split(",")) { for (String itemName : config.getString("item-spawn-blacklist", "").split(","))
{
itemName = itemName.trim(); itemName = itemName.trim();
if (itemName.isEmpty()) { if (itemName.isEmpty())
{
continue; continue;
} }
ItemStack is; ItemStack is;
try { try
{
is = ess.getItemDb().get(itemName); is = ess.getItemDb().get(itemName);
epItemSpwn.add(is.getTypeId()); epItemSpwn.add(is.getTypeId());
} catch (Exception ex) { }
catch (Exception ex)
{
logger.log(Level.SEVERE, Util.format("unknownItemInList", itemName, "item-spawn-blacklist")); 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); return config.getBoolean("nether.use-1to1-ratio", false);
} }
@Override @Override
public double getNetherRatio() public double getNetherRatio()
{ {
if (config.getBoolean("nether.use-1to1-ratio", false)) { if (config.getBoolean("nether.use-1to1-ratio", false))
{
return 1.0; return 1.0;
} }
return config.getDouble("nether.ratio", 8.0); return config.getDouble("nether.ratio", 8.0);
} }
@Override @Override
public boolean isDebug() public boolean isDebug()
{ {
@ -374,9 +428,9 @@ public class Settings implements ISettings
@Override @Override
public boolean warnOnSmite() public boolean warnOnSmite()
{ {
return config.getBoolean("warn-on-smite" ,true); return config.getBoolean("warn-on-smite", true);
} }
@Override @Override
public boolean permissionBasedItemSpawn() public boolean permissionBasedItemSpawn()
{ {
@ -410,23 +464,28 @@ public class Settings implements ISettings
@Override @Override
public boolean getProtectPreventSpawn(final String creatureName) public boolean getProtectPreventSpawn(final String creatureName)
{ {
return config.getBoolean("protect.prevent.spawn."+creatureName, false); return config.getBoolean("protect.prevent.spawn." + creatureName, false);
} }
@Override @Override
public List<Integer> getProtectList(final String configName) public List<Integer> getProtectList(final String configName)
{ {
final List<Integer> list = new ArrayList<Integer>(); final List<Integer> list = new ArrayList<Integer>();
for (String itemName : config.getString(configName, "").split(",")) { for (String itemName : config.getString(configName, "").split(","))
{
itemName = itemName.trim(); itemName = itemName.trim();
if (itemName.isEmpty()) { if (itemName.isEmpty())
{
continue; continue;
} }
ItemStack itemStack; ItemStack itemStack;
try { try
{
itemStack = ess.getItemDb().get(itemName); itemStack = ess.getItemDb().get(itemName);
list.add(itemStack.getTypeId()); list.add(itemStack.getTypeId());
} catch (Exception ex) { }
catch (Exception ex)
{
logger.log(Level.SEVERE, Util.format("unknownItemInList", itemName, configName)); logger.log(Level.SEVERE, Util.format("unknownItemInList", itemName, configName));
} }
} }
@ -444,12 +503,13 @@ public class Settings implements ISettings
{ {
return config.getBoolean(configName, def); return config.getBoolean(configName, def);
} }
private final static double MAXMONEY = 10000000000000.0; private final static double MAXMONEY = 10000000000000.0;
public double getMaxMoney() public double getMaxMoney()
{ {
double max = config.getDouble("max-money", MAXMONEY); double max = config.getDouble("max-money", MAXMONEY);
if (Math.abs(max) > MAXMONEY) { if (Math.abs(max) > MAXMONEY)
{
max = max < 0 ? -MAXMONEY : MAXMONEY; max = max < 0 ? -MAXMONEY : MAXMONEY;
} }
return max; return max;
@ -459,7 +519,7 @@ public class Settings implements ISettings
{ {
return config.getBoolean("economy-log-enabled", false); return config.getBoolean("economy-log-enabled", false);
} }
public boolean removeGodOnDisconnect() public boolean removeGodOnDisconnect()
{ {
return config.getBoolean("remove-god-on-disconnect", false); return config.getBoolean("remove-god-on-disconnect", false);

View File

@ -10,6 +10,7 @@ import org.bukkit.entity.Player;
/** /**
* Original authors: toi & Raphfrk * Original authors: toi & Raphfrk
*/ */
@Deprecated
public class TargetBlock public class TargetBlock
{ {
private transient final Location location; private transient final Location location;

View File

@ -20,14 +20,12 @@ public class User extends UserData implements Comparable<User>, IReplyTo, IUser
private transient long lastOnlineActivity; private transient long lastOnlineActivity;
private transient long lastActivity = System.currentTimeMillis(); private transient long lastActivity = System.currentTimeMillis();
private boolean hidden = false; private boolean hidden = false;
private transient boolean godStateBeforeAfk;
private transient Location afkPosition; private transient Location afkPosition;
User(final Player base, final IEssentials ess) User(final Player base, final IEssentials ess)
{ {
super(base, ess); super(base, ess);
teleport = new Teleport(this, ess); teleport = new Teleport(this, ess);
godStateBeforeAfk = isGodModeEnabled();
afkPosition = getLocation(); afkPosition = getLocation();
} }
@ -284,6 +282,12 @@ public class User extends UserData implements Comparable<User>, IReplyTo, IUser
return nickname.toString(); return nickname.toString();
} }
public void setDisplayNick(String name)
{
setDisplayName(name);
setPlayerListName(name);
}
public Teleport getTeleport() public Teleport getTeleport()
{ {
@ -348,15 +352,6 @@ public class User extends UserData implements Comparable<User>, IReplyTo, IUser
public void setAfk(final boolean set) public void setAfk(final boolean set)
{ {
this.setSleepingIgnored(this.isAuthorized("essentials.sleepingignored") ? true : 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()) { if (set && !isAfk()) {
afkPosition = getLocation(); afkPosition = getLocation();
} }
@ -460,7 +455,7 @@ public class User extends UserData implements Comparable<User>, IReplyTo, IUser
} }
} }
final long autoafk = ess.getSettings().getAutoAfk(); 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); setAfk(true);
if (!isHidden()) { if (!isHidden()) {
@ -481,5 +476,11 @@ public class User extends UserData implements Comparable<User>, IReplyTo, IUser
setFoodLevel(20); setFoodLevel(20);
} }
return super.toggleGodModeEnabled(); return super.toggleGodModeEnabled();
} }
@Override
public boolean isGodModeEnabled()
{
return super.isGodModeEnabled() || (isAfk() && ess.getSettings().getFreezeAfkPlayers());
}
} }

View File

@ -58,6 +58,7 @@ public abstract class UserData extends PlayerExtension implements IConf
isSocialSpyEnabled = _isSocialSpyEnabled(); isSocialSpyEnabled = _isSocialSpyEnabled();
isNPC = _isNPC(); isNPC = _isNPC();
arePowerToolsEnabled = _arePowerToolsEnabled(); arePowerToolsEnabled = _arePowerToolsEnabled();
kitTimestamps = _getKitTimestamps();
} }
private double money; private double money;
@ -163,7 +164,12 @@ public abstract class UserData extends PlayerExtension implements IConf
public void delHome(String name) throws Exception 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); homes.remove(name);
config.removeProperty("homes." + 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(); powertools.clear();
config.setProperty("powertools", powertools); config.setProperty("powertools", powertools);
config.save(); config.save();
} }
public List<String> getPowertool(ItemStack stack) public List<String> getPowertool(ItemStack stack)
{ {
return (List<String>)powertools.get(stack.getTypeId()); return (List<String>)powertools.get(stack.getTypeId());
@ -267,12 +274,11 @@ public abstract class UserData extends PlayerExtension implements IConf
config.setProperty("powertools", powertools); config.setProperty("powertools", powertools);
config.save(); config.save();
} }
public boolean hasPowerTools() public boolean hasPowerTools()
{ {
return powertools.size() > 0; return powertools.size() > 0;
} }
private Location lastLocation; private Location lastLocation;
private Location _getLastLocation() private Location _getLastLocation()
@ -294,6 +300,10 @@ public abstract class UserData extends PlayerExtension implements IConf
public void setLastLocation(Location loc) public void setLastLocation(Location loc)
{ {
if (loc == null || loc.getWorld() == null)
{
return;
}
lastLocation = loc; lastLocation = loc;
config.setProperty("lastlocation", loc); config.setProperty("lastlocation", loc);
config.save(); config.save();
@ -781,31 +791,57 @@ public abstract class UserData extends PlayerExtension implements IConf
config.setProperty("npc", set); config.setProperty("npc", set);
config.save(); config.save();
} }
private boolean arePowerToolsEnabled; private boolean arePowerToolsEnabled;
public boolean arePowerToolsEnabled() public boolean arePowerToolsEnabled()
{ {
return arePowerToolsEnabled; return arePowerToolsEnabled;
} }
public void setPowerToolsEnabled(boolean set) public void setPowerToolsEnabled(boolean set)
{ {
arePowerToolsEnabled = set; arePowerToolsEnabled = set;
config.setProperty("powertoolsenabled", set); config.setProperty("powertoolsenabled", set);
config.save(); config.save();
} }
public boolean togglePowerToolsEnabled() public boolean togglePowerToolsEnabled()
{ {
boolean ret = !arePowerToolsEnabled(); boolean ret = !arePowerToolsEnabled();
setPowerToolsEnabled(ret); setPowerToolsEnabled(ret);
return ret; return ret;
} }
private boolean _arePowerToolsEnabled() private boolean _arePowerToolsEnabled()
{ {
return config.getBoolean("powertoolsenabled", true); return config.getBoolean("powertoolsenabled", true);
} }
private Map<String, Object> kitTimestamps;
private Map<String, Object> _getKitTimestamps()
{
final Object map = config.getProperty("timestamps.kits");
if (map instanceof Map)
{
return (Map<String, Object>)map;
}
else
{
return new HashMap<String, Object>();
}
}
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();
}
} }

View File

@ -227,30 +227,36 @@ public class Util
AIR_MATERIALS.add(Material.SAPLING.getId()); AIR_MATERIALS.add(Material.SAPLING.getId());
AIR_MATERIALS.add(Material.POWERED_RAIL.getId()); AIR_MATERIALS.add(Material.POWERED_RAIL.getId());
AIR_MATERIALS.add(Material.DETECTOR_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.DEAD_BUSH.getId());
AIR_MATERIALS.add(Material.RAILS.getId());
AIR_MATERIALS.add(Material.YELLOW_FLOWER.getId()); AIR_MATERIALS.add(Material.YELLOW_FLOWER.getId());
AIR_MATERIALS.add(Material.RED_ROSE.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.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.SEEDS.getId());
AIR_MATERIALS.add(Material.SIGN_POST.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.LADDER.getId());
AIR_MATERIALS.add(Material.SUGAR_CANE_BLOCK.getId()); AIR_MATERIALS.add(Material.RAILS.getId());
AIR_MATERIALS.add(Material.REDSTONE_WIRE.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_OFF.getId());
AIR_MATERIALS.add(Material.REDSTONE_TORCH_ON.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_BUTTON.getId());
AIR_MATERIALS.add(Material.STONE_PLATE.getId()); AIR_MATERIALS.add(Material.SUGAR_CANE_BLOCK.getId());
AIR_MATERIALS.add(Material.WOOD_PLATE.getId()); AIR_MATERIALS.add(Material.DIODE_BLOCK_OFF.getId());
AIR_MATERIALS.add(Material.IRON_DOOR_BLOCK.getId()); AIR_MATERIALS.add(Material.DIODE_BLOCK_ON.getId());
AIR_MATERIALS.add(Material.WOODEN_DOOR.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 public static Location getSafeDestination(final Location loc) throws Exception
@ -260,9 +266,9 @@ public class Util
throw new Exception(Util.i18n("destinationNotSet")); throw new Exception(Util.i18n("destinationNotSet"));
} }
final World world = loc.getWorld(); final World world = loc.getWorld();
int x = (int)Math.round(loc.getX()); int x = loc.getBlockX();
int y = (int)Math.round(loc.getY()); int y = (int)Math.round(loc.getY());
int z = (int)Math.round(loc.getZ()); int z = loc.getBlockZ();
while (isBlockAboveAir(world, x, y, z)) while (isBlockAboveAir(world, x, y, z))
{ {

View File

@ -31,7 +31,7 @@ public class Commanddelhome extends EssentialsCommand
} }
else if (args.length > 1 && (user == null || user.isAuthorized("essentials.delhome.others"))) 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]; name = args[1];
} }
else else

View File

@ -34,6 +34,7 @@ public class Commandheal extends EssentialsCommand
user.healCooldown(); user.healCooldown();
} }
user.setHealth(20); user.setHealth(20);
user.setFoodLevel(20);
user.sendMessage(Util.i18n("heal")); user.sendMessage(Util.i18n("heal"));
} }

View File

@ -15,22 +15,20 @@ import org.bukkit.inventory.ItemStack;
public class Commandkit extends EssentialsCommand public class Commandkit extends EssentialsCommand
{ {
static private final Map<User, Map<String, Long>> kitPlayers = new HashMap<User, Map<String, Long>>();
public Commandkit() public Commandkit()
{ {
super("kit"); super("kit");
} }
@Override @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) if (args.length < 1)
{ {
try try
{ {
Map<String, Object> kits = ess.getSettings().getKits(); final Map<String, Object> kits = ess.getSettings().getKits();
StringBuilder list = new StringBuilder(); final StringBuilder list = new StringBuilder();
for (String k : kits.keySet()) for (String k : kits.keySet())
{ {
if (user.isAuthorized("essentials.kit." + k.toLowerCase())) if (user.isAuthorized("essentials.kit." + k.toLowerCase()))
@ -56,8 +54,8 @@ public class Commandkit extends EssentialsCommand
{ {
try try
{ {
String kitName = args[0].toLowerCase(); final String kitName = args[0].toLowerCase();
Object kit = ess.getSettings().getKit(kitName); final Object kit = ess.getSettings().getKit(kitName);
List<String> items; List<String> items;
if (!user.isAuthorized("essentials.kit." + kitName)) if (!user.isAuthorized("essentials.kit." + kitName))
@ -70,39 +68,26 @@ public class Commandkit extends EssentialsCommand
{ {
//System.out.println("Kit is timed"); //System.out.println("Kit is timed");
Map<String, Object> els = (Map<String, Object>)kit; final Map<String, Object> els = (Map<String, Object>)kit;
items = (List<String>)els.get("items"); items = (List<String>)els.get("items");
double delay = els.containsKey("delay") ? ((Number)els.get("delay")).doubleValue() : 0L; final double delay = els.containsKey("delay") ? ((Number)els.get("delay")).doubleValue() : 0L;
Calendar c = new GregorianCalendar(); final Calendar c = new GregorianCalendar();
c.add(Calendar.SECOND, (int)delay); c.add(Calendar.SECOND, -(int)delay);
c.add(Calendar.MILLISECOND, (int)((delay*1000.0)%1000.0)); c.add(Calendar.MILLISECOND, -(int)((delay*1000.0)%1000.0));
long time = c.getTimeInMillis(); final long mintime = c.getTimeInMillis();
Calendar now = new GregorianCalendar();
final Long lastTime = user.getKitTimestamp(kitName);
Map<String, Long> kitTimes; if (lastTime == null || lastTime < mintime) {
if (!kitPlayers.containsKey(user)) final Calendar now = new GregorianCalendar();
{ user.setKitTimestamp(kitName, now.getTimeInMillis());
kitTimes = new HashMap<String, Long>(); } else {
kitTimes.put(kitName, time); final Calendar future = new GregorianCalendar();
kitPlayers.put(user, kitTimes); future.setTimeInMillis(lastTime);
} future.add(Calendar.SECOND, (int)delay);
else future.add(Calendar.MILLISECOND, (int)((delay*1000.0)%1000.0));
{ user.sendMessage(Util.format("kitTimed", Util.formatDateDiff(future.getTimeInMillis())));
kitTimes = kitPlayers.get(user); return;
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;
}
} }
} }
catch (Exception ex) catch (Exception ex)
@ -110,7 +95,7 @@ public class Commandkit extends EssentialsCommand
items = (List<String>)kit; items = (List<String>)kit;
} }
Trade charge = new Trade("kit-" + kitName, ess); final Trade charge = new Trade("kit-" + kitName, ess);
try try
{ {
charge.isAffordableFor(user); charge.isAffordableFor(user);
@ -124,11 +109,11 @@ public class Commandkit extends EssentialsCommand
boolean spew = false; boolean spew = false;
for (String d : items) for (String d : items)
{ {
String[] parts = d.split("[^0-9]+", 3); final String[] parts = d.split("[^0-9]+", 3);
int id = Material.getMaterial(Integer.parseInt(parts[0])).getId(); final int id = Material.getMaterial(Integer.parseInt(parts[0])).getId();
int amount = parts.length > 1 ? Integer.parseInt(parts[parts.length > 2 ? 2 : 1]) : 1; final int amount = parts.length > 1 ? Integer.parseInt(parts[parts.length > 2 ? 2 : 1]) : 1;
short data = parts.length > 2 ? Short.parseShort(parts[1]) : 0; final short data = parts.length > 2 ? Short.parseShort(parts[1]) : 0;
HashMap<Integer,ItemStack> overfilled = user.getInventory().addItem(new ItemStack(id, amount, data)); final HashMap<Integer,ItemStack> overfilled = user.getInventory().addItem(new ItemStack(id, amount, data));
for (ItemStack itemStack : overfilled.values()) for (ItemStack itemStack : overfilled.values())
{ {
user.getWorld().dropItemNaturally(user.getLocation(), itemStack); user.getWorld().dropItemNaturally(user.getLocation(), itemStack);

View File

@ -23,13 +23,15 @@ public class Commandmail extends EssentialsCommand
List<String> mail = user.getMails(); List<String> mail = user.getMails();
if (mail.isEmpty()) if (mail.isEmpty())
{ {
throw new Exception(Util.i18n("noMail")); user.sendMessage(Util.i18n("noMail"));
throw new NoChargeException();
} }
for (String s : mail) for (String s : mail)
{ {
user.sendMessage(s); user.sendMessage(s);
} }
throw new Exception(Util.i18n("mailClear")); user.sendMessage(Util.i18n("mailClear"));
return;
} }
if (args.length >= 3 && "send".equalsIgnoreCase(args[0])) 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])) if (args.length >= 1 && "clear".equalsIgnoreCase(args[0]))
{ {
user.setMails(null); user.setMails(null);
throw new Exception(Util.i18n("mailCleared")); user.sendMessage(Util.i18n("mailCleared"));
return;
} }
throw new NoChargeException(); throw new NotEnoughArgumentsException();
} }
} }

View File

@ -41,7 +41,7 @@ public class Commandnick extends EssentialsCommand
String nick = args[0]; String nick = args[0];
if ("off".equalsIgnoreCase(nick) || user.getName().equalsIgnoreCase(nick)) if ("off".equalsIgnoreCase(nick) || user.getName().equalsIgnoreCase(nick))
{ {
user.setDisplayName(user.getName()); user.setDisplayNick(user.getName());
user.setNickname(null); user.setNickname(null);
user.sendMessage(Util.i18n("nickNoMore")); user.sendMessage(Util.i18n("nickNoMore"));
return; 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.setNickname(nick);
user.sendMessage(Util.format("nickSet", user.getDisplayName() + "§7.")); user.sendMessage(Util.format("nickSet", user.getDisplayName() + "§7."));
} }
@ -95,13 +95,13 @@ public class Commandnick extends EssentialsCommand
String nick = args[1]; String nick = args[1];
if ("off".equalsIgnoreCase(nick) || target.getName().equalsIgnoreCase(nick)) if ("off".equalsIgnoreCase(nick) || target.getName().equalsIgnoreCase(nick))
{ {
target.setDisplayName(target.getName()); target.setDisplayNick(target.getName());
target.setNickname(null); target.setNickname(null);
target.sendMessage(Util.i18n("nickNoMore")); target.sendMessage(Util.i18n("nickNoMore"));
} }
else else
{ {
target.setDisplayName(ess.getSettings().getNicknamePrefix() + nick); target.setDisplayNick(ess.getSettings().getNicknamePrefix() + nick);
target.setNickname(nick); target.setNickname(nick);
target.sendMessage(Util.format("nickSet", target.getDisplayName() + "§7.")); target.sendMessage(Util.format("nickSet", target.getDisplayName() + "§7."));
} }

View File

@ -28,14 +28,14 @@ public class Commandsethome extends EssentialsCommand
{ {
if (user.isAuthorized("essentials.sethome.multiple")) 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.getHomes().contains(args[0].toLowerCase())))
{ {
user.setHome(args[0].toLowerCase()); user.setHome(args[0].toLowerCase());
} }
else else
{ {
throw new Exception(Util.format("maxHomes", ess.getSettings().getMultipleHomes())); throw new Exception(Util.format("maxHomes", ess.getSettings().getHomeLimit(user)));
} }
} }

View File

@ -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; Entity spawnedMob = null;
Mob mob = null; Mob mob = null;
@ -72,6 +67,12 @@ public class Commandspawnmob extends EssentialsCommand
{ {
throw new Exception(Util.i18n("invalidMob")); throw new Exception(Util.i18n("invalidMob"));
} }
if (ess.getSettings().getProtectPreventSpawn(mob.getType().toString().toLowerCase()))
{
throw new Exception(Util.i18n("unableToSpawnMob"));
}
int[] ignore = int[] ignore =
{ {
8, 9 8, 9
@ -79,8 +80,7 @@ public class Commandspawnmob extends EssentialsCommand
Block block = (new TargetBlock(user, 300, 0.2, ignore)).getTargetBlock(); Block block = (new TargetBlock(user, 300, 0.2, ignore)).getTargetBlock();
if (block == null) if (block == null)
{ {
user.sendMessage(Util.i18n("unableToSpawnMob")); throw new Exception(Util.i18n("unableToSpawnMob"));
return;
} }
Location loc = block.getLocation(); Location loc = block.getLocation();
Location sloc = Util.getSafeDestination(loc); Location sloc = Util.getSafeDestination(loc);
@ -90,8 +90,7 @@ public class Commandspawnmob extends EssentialsCommand
} }
catch (MobException e) catch (MobException e)
{ {
user.sendMessage(Util.i18n("unableToSpawnMob")); throw new Exception(Util.i18n("unableToSpawnMob"));
return;
} }
if (mountType != null) if (mountType != null)
@ -102,14 +101,18 @@ public class Commandspawnmob extends EssentialsCommand
user.sendMessage(Util.i18n("invalidMob")); user.sendMessage(Util.i18n("invalidMob"));
return; return;
} }
if (ess.getSettings().getProtectPreventSpawn(mobMount.getType().toString().toLowerCase()))
{
throw new Exception(Util.i18n("unableToSpawnMob"));
}
try try
{ {
spawnedMount = mobMount.spawn(user, server, loc); spawnedMount = mobMount.spawn(user, server, loc);
} }
catch (MobException e) catch (MobException e)
{ {
user.sendMessage(Util.i18n("unableToSpawnMob")); throw new Exception(Util.i18n("unableToSpawnMob"));
return;
} }
spawnedMob.setPassenger(spawnedMount); spawnedMob.setPassenger(spawnedMount);
} }
@ -144,8 +147,7 @@ public class Commandspawnmob extends EssentialsCommand
} }
catch (MobException e) catch (MobException e)
{ {
user.sendMessage(Util.i18n("unableToSpawnMob")); throw new Exception(Util.i18n("unableToSpawnMob"));
return;
} }
spawnedMob.setPassenger(spawnedMount); spawnedMob.setPassenger(spawnedMount);
} }

View File

@ -92,6 +92,7 @@ spawnmob-limit: 10
warn-on-smite: true warn-on-smite: true
# The message of the day, displayed on connect and by typing /motd. # The message of the day, displayed on connect and by typing /motd.
# Valid tags are: {PLAYER}, {IP}, {BALANCE}, {MAILS}, {WORLD}, {ONLINE}, {UNIQUE}, {PLAYERLIST}
motd: motd:
- '&cWelcome, {PLAYER}&c!' - '&cWelcome, {PLAYER}&c!'
- '&fType &c/help&f for a list of commands.' - '&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 # If no home is set send you to spawn when /home is used
spawn-if-no-home: false spawn-if-no-home: false
# If users have essentials.sethome.multiple how many homes can they have # Allow players to have multiple homes.
# People with essentials.sethome.multiple.unlimited are not limited by this number # Define different amounts of multiple homes for different permissions, e.g. essentials.sethome.multiple.vip
multiple-homes: 5 # 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 use: true
# Should we tell people they are not allowed to build # Should we tell people they are not allowed to build
warn-on-build-disallow: false warn-on-build-disallow: true
# Disable weather options # Disable weather options

View File

@ -293,7 +293,7 @@ commands:
togglejail: togglejail:
description: Prevents a player from interacting with the world and teleports him/her to the the jail specified description: Prevents a player from interacting with the world and teleports him/her to the the jail specified
usage: /<command> [player] [jailname] <datediff> usage: /<command> [player] [jailname] <datediff>
aliases: [tjail,etogglejail] aliases: [tjail,unjail,eunjail,etogglejail]
top: top:
description: Teleport to the highest block at your current position. description: Teleport to the highest block at your current position.
usage: /<command> usage: /<command>

View File

@ -1,6 +1,7 @@
package com.earth2me.essentials; package com.earth2me.essentials;
import com.avaje.ebean.config.ServerConfig; import com.avaje.ebean.config.ServerConfig;
import java.io.File;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -14,7 +15,9 @@ import org.bukkit.Location;
import org.bukkit.Server; import org.bukkit.Server;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.World.Environment; import org.bukkit.World.Environment;
import org.bukkit.WorldCreator;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.command.PluginCommand; import org.bukkit.command.PluginCommand;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.generator.ChunkGenerator; import org.bukkit.generator.ChunkGenerator;
@ -43,41 +46,48 @@ public class FakeServer implements Server
return "1.0"; return "1.0";
} }
@Override
public Player[] getOnlinePlayers() public Player[] getOnlinePlayers()
{ {
return players.toArray(new Player[0]); return players.toArray(new Player[0]);
} }
public void setOnlinePlayers(List<Player> players) public void setOnlinePlayers(List<Player> players)
{ {
this.players = players; this.players = players;
} }
@Override
public int getMaxPlayers() public int getMaxPlayers()
{ {
return 100; return 100;
} }
@Override
public int getPort() public int getPort()
{ {
return 25565; return 25565;
} }
@Override
public String getIp() public String getIp()
{ {
return "127.0.0.1"; return "127.0.0.1";
} }
@Override
public String getServerName() public String getServerName()
{ {
return "Test Server"; return "Test Server";
} }
@Override
public String getServerId() public String getServerId()
{ {
return "Test Server"; return "Test Server";
} }
@Override
public int broadcastMessage(String string) public int broadcastMessage(String string)
{ {
int i = 0; int i = 0;
@ -89,11 +99,19 @@ public class FakeServer implements Server
return i; return i;
} }
@Override
public String getUpdateFolder() public String getUpdateFolder()
{ {
return "update"; return "update";
} }
@Override
public File getUpdateFolderFile()
{
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public Player getPlayer(String string) public Player getPlayer(String string)
{ {
for (Player player : players) for (Player player : players)
@ -106,6 +124,7 @@ public class FakeServer implements Server
return null; return null;
} }
@Override
public List<Player> matchPlayer(String string) public List<Player> matchPlayer(String string)
{ {
List<Player> matches = new ArrayList<Player>(); List<Player> matches = new ArrayList<Player>();
@ -119,15 +138,17 @@ public class FakeServer implements Server
return matches; return matches;
} }
@Override
public PluginManager getPluginManager() public PluginManager getPluginManager()
{ {
throw new UnsupportedOperationException("Not supported yet."); throw new UnsupportedOperationException("Not supported yet.");
} }
@Override
public BukkitScheduler getScheduler() public BukkitScheduler getScheduler()
{ {
return new BukkitScheduler() { return new BukkitScheduler()
{
@Override @Override
public int scheduleSyncDelayedTask(Plugin plugin, Runnable r, long l) public int scheduleSyncDelayedTask(Plugin plugin, Runnable r, long l)
{ {
@ -215,16 +236,19 @@ public class FakeServer implements Server
}; };
} }
@Override
public ServicesManager getServicesManager() public ServicesManager getServicesManager()
{ {
throw new UnsupportedOperationException("Not supported yet."); throw new UnsupportedOperationException("Not supported yet.");
} }
@Override
public List<World> getWorlds() public List<World> getWorlds()
{ {
return worlds; return worlds;
} }
@Override
public World createWorld(String string, Environment e) public World createWorld(String string, Environment e)
{ {
World w = new FakeWorld(string, e); World w = new FakeWorld(string, e);
@ -232,6 +256,7 @@ public class FakeServer implements Server
return w; return w;
} }
@Override
public World createWorld(String string, Environment e, long l) public World createWorld(String string, Environment e, long l)
{ {
World w = new FakeWorld(string, e); World w = new FakeWorld(string, e);
@ -239,45 +264,54 @@ public class FakeServer implements Server
return w; return w;
} }
@Override
public World getWorld(String string) public World getWorld(String string)
{ {
for (World world : worlds) for (World world : worlds)
{ {
if (world.getName().equalsIgnoreCase(string)) { if (world.getName().equalsIgnoreCase(string))
{
return world; return world;
} }
} }
return null; return null;
} }
@Override
public void reload() public void reload()
{ {
} }
@Override
public Logger getLogger() public Logger getLogger()
{ {
return Logger.getLogger("Minecraft"); return Logger.getLogger("Minecraft");
} }
@Override
public PluginCommand getPluginCommand(String string) public PluginCommand getPluginCommand(String string)
{ {
throw new UnsupportedOperationException("Not supported yet."); throw new UnsupportedOperationException("Not supported yet.");
} }
@Override
public void savePlayers() public void savePlayers()
{ {
} }
@Override
public boolean dispatchCommand(CommandSender cs, String string) public boolean dispatchCommand(CommandSender cs, String string)
{ {
throw new UnsupportedOperationException("Not supported yet."); throw new UnsupportedOperationException("Not supported yet.");
} }
@Override
public void configureDbConfig(ServerConfig sc) public void configureDbConfig(ServerConfig sc)
{ {
throw new UnsupportedOperationException("Not supported yet."); throw new UnsupportedOperationException("Not supported yet.");
} }
@Override
public boolean addRecipe(Recipe recipe) public boolean addRecipe(Recipe recipe)
{ {
throw new UnsupportedOperationException("Not supported yet."); throw new UnsupportedOperationException("Not supported yet.");
@ -287,7 +321,7 @@ public class FakeServer implements Server
{ {
players.add(base1); players.add(base1);
} }
public OfflinePlayer createPlayer(String name, IEssentials ess) public OfflinePlayer createPlayer(String name, IEssentials ess)
{ {
OfflinePlayer player = new OfflinePlayer(name, ess); OfflinePlayer player = new OfflinePlayer(name, ess);
@ -295,41 +329,55 @@ public class FakeServer implements Server
return player; return player;
} }
@Override
public World createWorld(String string, Environment e, ChunkGenerator cg) public World createWorld(String string, Environment e, ChunkGenerator cg)
{ {
throw new UnsupportedOperationException("Not supported yet."); throw new UnsupportedOperationException("Not supported yet.");
} }
@Override
public World createWorld(String string, Environment e, long l, ChunkGenerator cg) public World createWorld(String string, Environment e, long l, ChunkGenerator cg)
{ {
throw new UnsupportedOperationException("Not supported yet."); 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) public boolean unloadWorld(String string, boolean bln)
{ {
throw new UnsupportedOperationException("Not supported yet."); throw new UnsupportedOperationException("Not supported yet.");
} }
@Override
public boolean unloadWorld(World world, boolean bln) public boolean unloadWorld(World world, boolean bln)
{ {
throw new UnsupportedOperationException("Not supported yet."); throw new UnsupportedOperationException("Not supported yet.");
} }
@Override
public Map<String, String[]> getCommandAliases() public Map<String, String[]> getCommandAliases()
{ {
throw new UnsupportedOperationException("Not supported yet."); throw new UnsupportedOperationException("Not supported yet.");
} }
@Override
public int getSpawnRadius() public int getSpawnRadius()
{ {
throw new UnsupportedOperationException("Not supported yet."); throw new UnsupportedOperationException("Not supported yet.");
} }
@Override
public void setSpawnRadius(int i) public void setSpawnRadius(int i)
{ {
throw new UnsupportedOperationException("Not supported yet."); throw new UnsupportedOperationException("Not supported yet.");
} }
@Override
public boolean getOnlineMode() public boolean getOnlineMode()
{ {
throw new UnsupportedOperationException("Not supported yet."); throw new UnsupportedOperationException("Not supported yet.");
@ -340,6 +388,7 @@ public class FakeServer implements Server
throw new UnsupportedOperationException("Not supported yet."); throw new UnsupportedOperationException("Not supported yet.");
} }
@Override
public World getWorld(UUID uuid) public World getWorld(UUID uuid)
{ {
throw new UnsupportedOperationException("Not supported yet."); throw new UnsupportedOperationException("Not supported yet.");
@ -454,7 +503,19 @@ public class FakeServer implements Server
} }
@Override @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."); throw new UnsupportedOperationException("Not supported yet.");
} }

View File

@ -22,4 +22,17 @@ v 1.1:
- Added a BukkitPermsUpdateTask to only update superperms once on a load/reload. - Added a BukkitPermsUpdateTask to only update superperms once on a load/reload.
- Fix for GM not checking inheritance for known superperms nodes. - Fix for GM not checking inheritance for known superperms nodes.
- Optimized getAllPlayersPermissions and fixed pushing unknown perms to superperms. - Optimized getAllPlayersPermissions and fixed pushing unknown perms to superperms.
v 1.2: 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

View File

@ -1,12 +1,19 @@
settings: settings:
config:
# With this enabled anyone set as op has full permissions when managing GroupManager
opOverrides: true
data: data:
save: save:
# How often GroupManager will save it's data back to groups and users.yml
minutes: 10 minutes: 10
logging: logging:
# level of detail GroupManager will use when logging.
# Acceptable entries are - ALL,CONFIG,FINE,FINER,FINEST,INFO,OFF,SEVERE,WARNING
level: INFO level: INFO
permission: permission:
world: world:
mirror: mirror:
# Worlds listed here have their permissions mirrored in their children.
world: world:
- world_nether - world_nether
- world2 - world2

View File

@ -5,15 +5,12 @@
package org.anjocaido.groupmanager; package org.anjocaido.groupmanager;
import java.io.File; import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException; import java.io.IOException;
import java.util.Map; import java.util.Map;
import java.util.logging.Level; import java.util.logging.Level;
import org.anjocaido.groupmanager.utils.Tasks; import org.anjocaido.groupmanager.utils.Tasks;
import org.yaml.snakeyaml.Yaml; import org.bukkit.util.config.Configuration;
import org.yaml.snakeyaml.constructor.SafeConstructor;
import org.yaml.snakeyaml.reader.UnicodeReader;
/** /**
* *
@ -22,9 +19,9 @@ import org.yaml.snakeyaml.reader.UnicodeReader;
public class GMConfiguration { public class GMConfiguration {
private GroupManager plugin; private GroupManager plugin;
private Map<String, Object> rootDataNode;
private File configFile; private File configFile;
private Configuration GMconfig;
public GMConfiguration(GroupManager plugin) { public GMConfiguration(GroupManager plugin) {
this.plugin = plugin; this.plugin = plugin;
load(); load();
@ -44,77 +41,37 @@ public class GMConfiguration {
} }
} }
Yaml yaml = new Yaml(new SafeConstructor()); GMconfig = new Configuration(configFile);
FileInputStream rx = null;
try { try {
rx = new FileInputStream(configFile); GMconfig.load();
} catch (FileNotFoundException ex) {
GroupManager.logger.log(Level.SEVERE, null, ex);
}
try {
rootDataNode = (Map<String, Object>) yaml.load(new UnicodeReader(rx));
if (rootDataNode == null) {
throw new NullPointerException();
}
} catch (Exception ex) { } catch (Exception ex) {
throw new IllegalArgumentException("The following file couldn't pass on Parser.\n" + configFile.getPath(), ex); throw new IllegalArgumentException("The following file couldn't pass on Parser.\n" + configFile.getPath(), ex);
} finally {
try {
rx.close();
} catch (IOException ex) {
}
} }
adjustLoggerLevel(); adjustLoggerLevel();
} }
public Map<String, Object> getMirrorsMap() { public boolean isOpOverride() {
if (rootDataNode.get("settings") instanceof Map) { return GMconfig.getBoolean("settings.config.opOverrides", true);
Map<String, Object> settingsNode = (Map<String, Object>) rootDataNode.get("settings");
if (settingsNode.get("permission") instanceof Map) {
Map<String, Object> permissionNode = (Map<String, Object>) settingsNode.get("permission");
if (permissionNode.get("world") instanceof Map) {
Map<String, Object> worldsNode = (Map<String, Object>) permissionNode.get("world");
if (worldsNode.get("mirror") instanceof Map) {
Map<String, Object> mirrorsNode = (Map<String, Object>) worldsNode.get("mirror");
return mirrorsNode;
}
}
}
}
return null;
} }
public Integer getSaveInterval() { @SuppressWarnings("unchecked")
if (rootDataNode.get("settings") instanceof Map) { public Map<String, Object> getMirrorsMap() {
Map<String, Object> settingsNode = (Map<String, Object>) rootDataNode.get("settings"); return (Map<String, Object>) GMconfig.getProperty("settings.permission.world.mirror");
if (settingsNode.get("data") instanceof Map) { }
Map<String, Object> dataNode = (Map<String, Object>) settingsNode.get("data");
if (dataNode.get("save") instanceof Map) { public Integer getSaveInterval() {
Map<String, Object> saveNode = (Map<String, Object>) dataNode.get("save"); return GMconfig.getInt("settings.data.save.minutes", 10);
if (saveNode.get("minutes") instanceof Integer) {
return (Integer) saveNode.get("minutes");
}
}
}
}
return 10;
} }
public void adjustLoggerLevel() { public void adjustLoggerLevel() {
if (rootDataNode.get("settings") instanceof Map) {
Map<String, Object> settingsNode = (Map<String, Object>) rootDataNode.get("settings"); try {
if (settingsNode.get("logging") instanceof Map) { GroupManager.logger.setLevel(Level.parse(GMconfig.getString("settings.logging.level", "INFO")));
Map<String, Object> loggingNode = (Map<String, Object>) settingsNode.get("logging"); return;
if (loggingNode.get("level") instanceof String) { } catch (Exception e) {
String level = (String) loggingNode.get("level");
try {
GroupManager.logger.setLevel(Level.parse(level));
return;
} catch (Exception e) {
}
}
}
} }
GroupManager.logger.setLevel(Level.INFO);
GroupManager.logger.setLevel(Level.INFO);
} }
} }

View File

@ -24,6 +24,7 @@ import java.util.concurrent.TimeUnit;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import org.anjocaido.groupmanager.dataholder.worlds.WorldsHolder; import org.anjocaido.groupmanager.dataholder.worlds.WorldsHolder;
import org.anjocaido.groupmanager.events.GMWorldListener;
import org.anjocaido.groupmanager.utils.GMLoggerHandler; import org.anjocaido.groupmanager.utils.GMLoggerHandler;
import org.anjocaido.groupmanager.utils.PermissionCheckResult; import org.anjocaido.groupmanager.utils.PermissionCheckResult;
import org.anjocaido.groupmanager.utils.Tasks; import org.anjocaido.groupmanager.utils.Tasks;
@ -32,9 +33,12 @@ import org.bukkit.command.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.command.ConsoleCommandSender; import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.entity.Player; 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.PluginDescriptionFile;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
@SuppressWarnings("unused") @SuppressWarnings("unused")
/** /**
* *
@ -55,6 +59,7 @@ public class GroupManager extends JavaPlugin {
private GMConfiguration config; private GMConfiguration config;
private GMLoggerHandler ch; private GMLoggerHandler ch;
public static BukkitPermissions BukkitPermissions; public static BukkitPermissions BukkitPermissions;
private static WorldListener WorldEvents;
public static final Logger logger = Logger.getLogger(GroupManager.class.getName()); public static final Logger logger = Logger.getLogger(GroupManager.class.getName());
//PERMISSIONS FOR COMMAND BEING LOADED //PERMISSIONS FOR COMMAND BEING LOADED
@ -69,6 +74,10 @@ public class GroupManager extends JavaPlugin {
worldsHolder.saveChanges(); worldsHolder.saveChanges();
} }
disableScheduler(); disableScheduler();
WorldEvents = null;
BukkitPermissions = null;
// EXAMPLE: Custom code, here we just output some info so we can check all is well // EXAMPLE: Custom code, here we just output some info so we can check all is well
PluginDescriptionFile pdfFile = this.getDescription(); PluginDescriptionFile pdfFile = this.getDescription();
System.out.println(pdfFile.getName() + " version " + pdfFile.getVersion() + " is disabled!"); 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"); 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); BukkitPermissions = new BukkitPermissions(this);
enableScheduler(); enableScheduler();
/* /*
@ -108,9 +119,10 @@ public class GroupManager extends JavaPlugin {
setLoaded(true); setLoaded(true);
} }
//setLoaded(true);
System.out.println(pdfFile.getName() + " version " + pdfFile.getVersion() + " is enabled!"); System.out.println(pdfFile.getName() + " version " + pdfFile.getVersion() + " is enabled!");
} }
public static boolean isLoaded() { public static boolean isLoaded() {
return isLoaded; return isLoaded;
@ -232,6 +244,7 @@ public class GroupManager extends JavaPlugin {
Player senderPlayer = null, targetPlayer = null; Player senderPlayer = null, targetPlayer = null;
Group senderGroup = null; Group senderGroup = null;
User senderUser = null; User senderUser = null;
boolean isOpOverride = config.isOpOverride();
//DETERMINING PLAYER INFORMATION //DETERMINING PLAYER INFORMATION
@ -239,8 +252,10 @@ public class GroupManager extends JavaPlugin {
senderPlayer = (Player) sender; senderPlayer = (Player) sender;
senderUser = worldsHolder.getWorldData(senderPlayer).getUser(senderPlayer.getName()); senderUser = worldsHolder.getWorldData(senderPlayer).getUser(senderPlayer.getName());
senderGroup = senderUser.getGroup(); senderGroup = senderUser.getGroup();
isOpOverride = (isOpOverride && senderPlayer.isOp());
System.out.println("[PLAYER_COMMAND] " + senderPlayer.getName() + ": /" + commandLabel + " " + Tasks.join(args, " ")); 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; playerCanDo = true;
} }
} else if (sender instanceof ConsoleCommandSender) { } else if (sender instanceof ConsoleCommandSender) {
@ -338,27 +353,19 @@ public class GroupManager extends JavaPlugin {
} }
//VALIDANDO PERMISSAO //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."); sender.sendMessage(ChatColor.RED + "Can't modify player with same permissions than you, or higher.");
return false; 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."); sender.sendMessage(ChatColor.RED + "The destination group can't be the same as yours, or higher.");
return false; 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."); sender.sendMessage(ChatColor.RED + "Can't modify player involving a group that you don't inherit.");
return false; 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 //PARECE OK
auxUser.setGroup(auxGroup); auxUser.setGroup(auxGroup);
sender.sendMessage(ChatColor.YELLOW + "You changed player '" + auxUser.getName() + "' group to '" + auxGroup.getName() + "'."); 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]); auxUser = dataHolder.getUser(args[0]);
} }
//VALIDANDO PERMISSAO //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."); sender.sendMessage(ChatColor.RED + "Can't modify player with same permissions than you, or higher.");
return false; return false;
} }
@ -436,7 +443,7 @@ public class GroupManager extends JavaPlugin {
return false; return false;
} }
//VALIDANDO PERMISSAO //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."); sender.sendMessage(ChatColor.RED + "Can't modify player with same permissions than you, or higher.");
return false; return false;
} }
@ -472,7 +479,7 @@ public class GroupManager extends JavaPlugin {
auxUser = dataHolder.getUser(args[0]); auxUser = dataHolder.getUser(args[0]);
} }
//VALIDANDO PERMISSAO //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."); sender.sendMessage(ChatColor.RED + "Can't modify player with same permissions than you, or higher.");
return false; return false;
} }
@ -557,7 +564,7 @@ public class GroupManager extends JavaPlugin {
return false; return false;
} }
permissionResult = permissionHandler.checkFullUserPermission(senderUser, args[1]); 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))) { || permissionResult.resultType.equals(PermissionCheckResult.Type.NEGATION))) {
sender.sendMessage(ChatColor.RED + "Can't add a permission you don't have."); sender.sendMessage(ChatColor.RED + "Can't add a permission you don't have.");
return false; return false;
@ -620,12 +627,12 @@ public class GroupManager extends JavaPlugin {
auxUser = dataHolder.getUser(args[0]); auxUser = dataHolder.getUser(args[0]);
} }
//VALIDANDO SUA PERMISSAO //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."); sender.sendMessage(ChatColor.RED + "Can't modify player with same group than you, or higher.");
return false; return false;
} }
permissionResult = permissionHandler.checkFullUserPermission(senderUser, args[1]); 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))) { || permissionResult.resultType.equals(PermissionCheckResult.Type.NEGATION))) {
sender.sendMessage(ChatColor.RED + "Can't remove a permission you don't have."); sender.sendMessage(ChatColor.RED + "Can't remove a permission you don't have.");
return false; return false;
@ -1554,23 +1561,23 @@ public class GroupManager extends JavaPlugin {
return false; return false;
} }
//VALIDANDO PERMISSAO //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."); sender.sendMessage(ChatColor.RED + "Can't modify player with same permissions than you, or higher.");
return false; 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."); sender.sendMessage(ChatColor.RED + "The destination group can't be the same as yours, or higher.");
return false; 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."); sender.sendMessage(ChatColor.RED + "Can't modify player involving a group that you don't inherit.");
return false; 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."); sender.sendMessage(ChatColor.RED + "Can't modify player using groups with different heritage line.");
return false; 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."); sender.sendMessage(ChatColor.RED + "The new group must be a higher rank.");
return false; return false;
} }
@ -1612,23 +1619,23 @@ public class GroupManager extends JavaPlugin {
return false; return false;
} }
//VALIDANDO PERMISSAO //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."); sender.sendMessage(ChatColor.RED + "Can't modify player with same permissions than you, or higher.");
return false; 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."); sender.sendMessage(ChatColor.RED + "The destination group can't be the same as yours, or higher.");
return false; 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."); sender.sendMessage(ChatColor.RED + "Can't modify player involving a group that you don' inherit.");
return false; 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."); sender.sendMessage(ChatColor.RED + "Can't modify player using groups with different heritage line.");
return false; 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."); sender.sendMessage(ChatColor.RED + "The new group must be a lower rank.");
return false; return false;
} }

View File

@ -18,6 +18,7 @@ public class BukkitPermsUpdateTask implements Runnable {
public void run() { public void run() {
// Signal loaded and update BukkitPermissions. // Signal loaded and update BukkitPermissions.
GroupManager.setLoaded(true); GroupManager.setLoaded(true);
GroupManager.BukkitPermissions.collectPermissions();
GroupManager.BukkitPermissions.updateAllPlayers(); GroupManager.BukkitPermissions.updateAllPlayers();
GroupManager.logger.info("Bukkit Permissions Updated!"); GroupManager.logger.info("Bukkit Permissions Updated!");

View File

@ -767,13 +767,15 @@ public class WorldDataHolder {
aGroupMap.put("permissions", group.getPermissionList()); aGroupMap.put("permissions", group.getPermissionList());
} }
DumperOptions opt = new DumperOptions(); if (!root.isEmpty()) {
opt.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); DumperOptions opt = new DumperOptions();
final Yaml yaml = new Yaml(opt); opt.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
try { final Yaml yaml = new Yaml(opt);
yaml.dump(root, new OutputStreamWriter(new FileOutputStream(groupsFile), "UTF-8")); try {
} catch (UnsupportedEncodingException ex) { yaml.dump(root, new OutputStreamWriter(new FileOutputStream(groupsFile), "UTF-8"));
} catch (FileNotFoundException ex) { } catch (UnsupportedEncodingException ex) {
} catch (FileNotFoundException ex) {
}
} }
/*FileWriter tx = null; /*FileWriter tx = null;
@ -829,13 +831,16 @@ public class WorldDataHolder {
aUserMap.put("subgroups", user.subGroupListStringCopy()); aUserMap.put("subgroups", user.subGroupListStringCopy());
//END SUBGROUPS NODE - BETA //END SUBGROUPS NODE - BETA
} }
DumperOptions opt = new DumperOptions();
opt.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); if (!root.isEmpty()) {
final Yaml yaml = new Yaml(opt); DumperOptions opt = new DumperOptions();
try { opt.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
yaml.dump(root, new OutputStreamWriter(new FileOutputStream(usersFile), "UTF-8")); final Yaml yaml = new Yaml(opt);
} catch (UnsupportedEncodingException ex) { try {
} catch (FileNotFoundException ex) { yaml.dump(root, new OutputStreamWriter(new FileOutputStream(usersFile), "UTF-8"));
} catch (UnsupportedEncodingException ex) {
} catch (FileNotFoundException ex) {
}
} }
/*FileWriter tx = null; /*FileWriter tx = null;
try { try {

View File

@ -21,6 +21,7 @@ import org.anjocaido.groupmanager.dataholder.WorldDataHolder;
import org.anjocaido.groupmanager.dataholder.OverloadedWorldHolder; import org.anjocaido.groupmanager.dataholder.OverloadedWorldHolder;
import org.anjocaido.groupmanager.permissions.AnjoPermissionsHandler; import org.anjocaido.groupmanager.permissions.AnjoPermissionsHandler;
import org.anjocaido.groupmanager.utils.Tasks; import org.anjocaido.groupmanager.utils.Tasks;
import org.bukkit.World;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
/** /**
@ -52,6 +53,7 @@ public class WorldsHolder {
*/ */
public WorldsHolder(GroupManager plugin) { public WorldsHolder(GroupManager plugin) {
this.plugin = plugin; this.plugin = plugin;
// Setup folders and check files exist for the primary world
verifyFirstRun(); verifyFirstRun();
initialLoad(); initialLoad();
if (defaultWorld == null) { if (defaultWorld == null) {
@ -60,21 +62,48 @@ public class WorldsHolder {
} }
private void initialLoad() { private void initialLoad() {
// load the initial world
initialWorldLoading(); initialWorldLoading();
// Configure and load any mirrors and additional worlds as defined in config.yml
mirrorSetUp(); mirrorSetUp();
// search the worlds folder for any manually created worlds (not listed in config.yml)
loadAllSearchedWorlds();
} }
private void initialWorldLoading() { private void initialWorldLoading() {
//LOAD EVERY WORLD POSSIBLE //Load the default world
loadWorld(serverDefaultWorldName); loadWorld(serverDefaultWorldName);
defaultWorld = worldsData.get(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()) { for (File folder : worldsFolder.listFiles()) {
if (folder.getName().equalsIgnoreCase(serverDefaultWorldName)) { if (folder.isDirectory()) {
continue; GroupManager.logger.info("World Found: " + folder.getName());
}
if (folder.isDirectory()) { /*
loadWorld(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<String, Object> mirrorsMap = plugin.getConfig().getMirrorsMap(); Map<String, Object> mirrorsMap = plugin.getConfig().getMirrorsMap();
if (mirrorsMap != null) { if (mirrorsMap != null) {
for (String source : mirrorsMap.keySet()) { 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) { if (mirrorsMap.get(source) instanceof ArrayList) {
ArrayList mirrorList = (ArrayList) mirrorsMap.get(source); ArrayList mirrorList = (ArrayList) mirrorsMap.get(source);
for (Object o : mirrorList) { for (Object o : mirrorList) {
@ -246,18 +281,25 @@ public class WorldsHolder {
} }
private void verifyFirstRun() { 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"); worldsFolder = new File(plugin.getDataFolder(), "worlds");
if (!worldsFolder.exists()) { if (!worldsFolder.exists()) {
worldsFolder.mkdirs(); worldsFolder.mkdirs();
} }
Properties server = new Properties();
try { File defaultWorldFolder = new File(worldsFolder, worldName);
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);
if (!defaultWorldFolder.exists()) { if (!defaultWorldFolder.exists()) {
defaultWorldFolder.mkdirs(); defaultWorldFolder.mkdirs();
} }

View File

@ -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.");
}
}
}

View File

@ -43,7 +43,6 @@ import org.bukkit.event.server.ServerListener;
import org.bukkit.permissions.Permission; import org.bukkit.permissions.Permission;
import org.bukkit.permissions.PermissionAttachment; import org.bukkit.permissions.PermissionAttachment;
import org.bukkit.permissions.PermissionAttachmentInfo; import org.bukkit.permissions.PermissionAttachmentInfo;
//import org.bukkit.permissions.PermissionAttachmentInfo;
import org.bukkit.plugin.Plugin; import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.PluginManager;
@ -79,13 +78,13 @@ public class BukkitPermissions {
PlayerEvents playerEventListener = new PlayerEvents(); PlayerEvents playerEventListener = new PlayerEvents();
manager.registerEvent(Event.Type.PLAYER_JOIN, 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.Normal, plugin); manager.registerEvent(Event.Type.PLAYER_KICK, playerEventListener, Event.Priority.Lowest, plugin);
manager.registerEvent(Event.Type.PLAYER_QUIT, playerEventListener, Event.Priority.Normal, 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_RESPAWN, playerEventListener, Event.Priority.Lowest, plugin);
manager.registerEvent(Event.Type.PLAYER_TELEPORT, playerEventListener, Event.Priority.Normal, plugin); manager.registerEvent(Event.Type.PLAYER_TELEPORT, playerEventListener, Event.Priority.Lowest, plugin);
manager.registerEvent(Event.Type.PLAYER_PORTAL, playerEventListener, Event.Priority.Normal, plugin); manager.registerEvent(Event.Type.PLAYER_PORTAL, playerEventListener, Event.Priority.Lowest, plugin);
ServerListener serverListener = new BukkitEvents(); ServerListener serverListener = new BukkitEvents();
@ -93,7 +92,7 @@ public class BukkitPermissions {
manager.registerEvent(Event.Type.PLUGIN_DISABLE, serverListener, Event.Priority.Normal, plugin); manager.registerEvent(Event.Type.PLUGIN_DISABLE, serverListener, Event.Priority.Normal, plugin);
} }
private void collectPermissions() { public void collectPermissions() {
registeredPermissions.clear(); registeredPermissions.clear();
for (Plugin bukkitPlugin : Bukkit.getServer().getPluginManager().getPlugins()) { for (Plugin bukkitPlugin : Bukkit.getServer().getPluginManager().getPlugins()) {
for(Permission permission : bukkitPlugin.getDescription().getPermissions()) for(Permission permission : bukkitPlugin.getDescription().getPermissions())
@ -134,8 +133,8 @@ public class BukkitPermissions {
Boolean value; Boolean value;
for (Permission permission : registeredPermissions) { for (Permission permission : registeredPermissions) {
value = worldData.getPermissionsHandler().checkUserPermission(user, permission.getName()); value = worldData.getPermissionsHandler().checkUserPermission(user, permission.getName());
if (value == true)
attachment.setPermission(permission, value); attachment.setPermission(permission, value);
} }
// Add any missing permissions for this player (non bukkit plugins) // Add any missing permissions for this player (non bukkit plugins)
@ -199,7 +198,7 @@ public class BukkitPermissions {
@Override @Override
public void onPlayerPortal(PlayerPortalEvent event) { // will portal into another world 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()); updatePermissions(event.getPlayer(), event.getTo().getWorld().getName());
} }
} }
@ -211,7 +210,7 @@ public class BukkitPermissions {
@Override @Override
public void onPlayerTeleport(PlayerTeleportEvent event) { // can be teleported into another world 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()); updatePermissions(event.getPlayer(), event.getTo().getWorld().getName());
} }
} }

Binary file not shown.

Binary file not shown.

Binary file not shown.