public bool CreateDungeonAndWarp(string dungeonName, int itemId, Creature leader)
{
lock (_createAndCleanUpLock)
{
try
{
var dungeon = this.CreateDungeon(dungeonName, itemId, leader);
var regionId = dungeon.Regions.First().Id;
// Warp the party currently standing on the altar into the dungeon.
var party = leader.Party;
var creators = party.GetCreaturesOnAltar(leader.RegionId);
// Add creature to list in case something went wrong.
// For example, there might be no altar, because the call
// came from the dungeon command.
if (creators.Count == 0)
creators.Add(leader);
// RP dungeon
if (dungeon.HasRoles)
{
// Get roles
var roles = dungeon.GetRoles();
if (roles.Count < creators.Count)
{
Send.Notice(leader, Localization.Get("Your party has too few members for this role-playing dungeon."));
return false;
}
// Create RP characters
var rpCharacters = new List<RpCharacter>();
for (int i = 0, j = 1; i < creators.Count; ++i)
{
var creator = creators[i];
var pos = creator.GetPosition();
// Get first role for leader or next available
// one for members.
var role = (creator == leader ? roles[0] : roles[j++]);
// Get actor data
var actorData = AuraData.ActorDb.Find(role);
if (actorData == null)
{
Log.Error("DungeonManager.CreateDungeonAndWarp: Actor data not found for '{0}'.", role);
return false;
}
try
{
var rpCharacter = new RpCharacter(actorData, creator, null);
rpCharacter.SetLocation(regionId, pos.X, pos.Y);
dungeon.RpCharacters.Add(rpCharacter.EntityId);
dungeon.Script.OnRpCharacterCreated(dungeon, rpCharacter);
rpCharacters.Add(rpCharacter);
}
catch
{
Log.Error("DungeonManager.CreateDungeonAndWarp: Failed to create RP character '{0}'.", role);
throw;
}
}
// Start RP sessions, which makes the players switch
// to the RP characters inside the dungeon.
foreach (var character in rpCharacters)
character.Start();
}
// Normal dungeon
else
{
// Warp in
foreach (var creator in creators)
{
// Warp member to same position in the lobby region.
var pos = creator.GetPosition();
creator.Warp(regionId, pos);
// TODO: This is a bit hacky, needs to be moved to Creature.Warp, with an appropriate check.
Send.EntitiesDisappear(creator.Client, creators);
}
}
return true;
}
catch (Exception ex)
{
Log.Exception(ex, "Failed to create and warp to dungeon.");
return false;
}
}
}
}