private Dungeon CreateDungeon(string dungeonName, int itemId, Creature creature)
{
Dungeon dungeon;
long instanceId = 0;
var rnd = RandomProvider.Get();
var itemData = AuraData.ItemDb.Find(itemId);
// Create new dungeon for passes (includes quest items).
// Since some "passes" don't have the dungeon_pass tag, but do
// have quest_item, and quest items are generally supposed to
// go to an NPC or onto an altar, we'll assume those are passes
// as well.
// If this assumption turnes out to be incorrect, we have to
// check for some items specifically, like the Goddess Pass in G1.
if (itemData != null && itemData.HasTag("/dungeon_pass/|/quest_item/"))
{
instanceId = this.GetInstanceId();
dungeon = new Dungeon(instanceId, dungeonName, itemId, rnd.Next(), rnd.Next(), creature);
}
else
{
// Create new dungeon if there's not one yet
var existing = this.Get(a => a.Name == dungeonName && a.ItemId == itemId);
if (existing == null || ChannelServer.Instance.Conf.World.PrivateDungeons)
{
// Random floor plan on Tuesday
var day = ErinnTime.Now.Month;
var floorPlan = (day == 2 || ChannelServer.Instance.Conf.World.RandomFloors ? rnd.Next() : day);
instanceId = this.GetInstanceId();
dungeon = new Dungeon(instanceId, dungeonName, itemId, rnd.Next(), floorPlan, creature);
}
else
dungeon = existing;
}
// Add new dungeon to list
if (instanceId != 0)
{
lock (_syncLock)
_dungeons.Add(instanceId, dungeon);
}
return dungeon;
}