public Zone([NotNull] string raw, [CanBeNull] World world)
: this()
{
if (raw == null)
{
throw new ArgumentNullException("raw");
}
string[] parts = raw.Split(',');
string[] header = parts[0].Split(' ');
Name = header[0];
Bounds = new BoundingBox(Int32.Parse(header[1]),
Int32.Parse(header[2]),
Int32.Parse(header[3]),
Int32.Parse(header[4]),
Int32.Parse(header[5]),
Int32.Parse(header[6]));
// If no ranks are loaded (e.g. MapConverter/MapRenderer)(
if (RankManager.Ranks.Count > 0)
{
Rank buildRank = Rank.Parse(header[7]);
// if all else fails, fall back to lowest class
if (buildRank == null)
{
if (world != null)
{
Controller.MinRank = world.BuildSecurity.MinRank;
}
else
{
Controller.ResetMinRank();
}
Logger.Log(LogType.Error,
"Zone: Error parsing zone definition: unknown rank \"{0}\". Permission reset to default ({1}).",
header[7],
Controller.MinRank.Name);
}
else
{
Controller.MinRank = buildRank;
}
}
// If PlayerDB is not loaded (e.g. ConfigGUI)
if (PlayerDB.IsLoaded)
{
// Part 2:
if (parts[1].Length > 0)
{
foreach (string playerName in parts[1].Split(' '))
{
if (!Player.IsValidPlayerName(playerName))
{
Logger.Log(LogType.Warning,
"Invalid entry in zone \"{0}\" whitelist: {1}",
Name,
playerName);
continue;
}
PlayerInfo info = PlayerDB.FindPlayerInfoExact(playerName);
if (info == null)
{
Logger.Log(LogType.Warning,
"Unrecognized player in zone \"{0}\" whitelist: {1}",
Name,
playerName);
continue; // player name not found in the DB (discarded)
}
Controller.Include(info);
}
}
// Part 3: excluded list
if (parts[2].Length > 0)
{
foreach (string playerName in parts[2].Split(' '))
{
if (!Player.IsValidPlayerName(playerName))
{
Logger.Log(LogType.Warning,
"Invalid entry in zone \"{0}\" blacklist: {1}",
Name,
playerName);
continue;
}
PlayerInfo info = PlayerDB.FindPlayerInfoExact(playerName);
if (info == null)
{
Logger.Log(LogType.Warning,
"Unrecognized player in zone \"{0}\" whitelist: {1}",
Name,
playerName);
continue; // player name not found in the DB (discarded)
}
Controller.Exclude(info);
}
}
}
else
{
RawWhitelist = parts[1];
RawBlacklist = parts[2];
}
// Part 4: extended header
if (parts.Length > 3)
{
string[] xheader = parts[3].Split(' ');
if (xheader[0] == "-")
{
CreatedBy = null;
CreatedDate = DateTime.MinValue;
}
else
{
CreatedBy = xheader[0];
CreatedDate = DateTime.Parse(xheader[1]);
}
if (xheader[2] == "-")
{
EditedBy = null;
EditedDate = DateTime.MinValue;
}
else
{
EditedBy = xheader[2];
EditedDate = DateTime.Parse(xheader[3]);
}
}
}