internal static void ReplaceWorld([NotNull] World oldWorld, [NotNull] World newWorld)
{
if (oldWorld == null)
{
throw new ArgumentNullException("oldWorld");
}
if (newWorld == null)
{
throw new ArgumentNullException("newWorld");
}
lock ( SyncRoot ) {
if (oldWorld == newWorld)
{
throw new WorldOpException(oldWorld.Name, WorldOpExceptionCode.NoChangeNeeded);
}
if (!WorldIndex.ContainsValue(oldWorld))
{
throw new WorldOpException(oldWorld.Name, WorldOpExceptionCode.WorldNotFound);
}
if (WorldIndex.ContainsValue(newWorld))
{
throw new InvalidOperationException("New world already exists on the list.");
}
// cycle load/unload on the new world to save it under the new name
newWorld.Name = oldWorld.Name;
if (newWorld.Preload)
{
newWorld.SaveMap();
}
else
{
newWorld.UnloadMap(false);
}
WorldIndex[oldWorld.Name.ToLower()] = newWorld;
oldWorld.Map = null;
// change the main worlds, if needed
if (oldWorld == MainWorld)
{
MainWorld = newWorld;
}
foreach (Rank rank in RankManager.Ranks)
{
if (rank.MainWorld == oldWorld)
{
rank.MainWorld = newWorld;
}
}
SaveWorldList();
UpdateWorldList();
}
}