public void UsePortal(RealmTime time, UsePortalPacket pkt)
{
Entity entity = Owner.GetEntity(pkt.ObjectId);
if (entity == null || !entity.Usable) return;
World world = null;
Player player = this;
Portal p = null;
if (entity is Portal)
{
p = entity as Portal;
world = p.WorldInstance;
}
if (world == null)
{
if (p != null)
{
bool setWorldInstance = true;
string d = "";
if (XmlDatas.IdToDungeon.TryGetValue(entity.ObjectType, out d))
{
world = RealmManager.AddWorld(new XMLWorld(XmlDatas.DungeonDescs[d]));
}
else
{
switch (entity.ObjectType) //handling default case for not found. Add more as implemented
{
case 0x0703: //portal of cowardice
{
if (RealmManager.PlayerWorldMapping.ContainsKey(this.AccountId)) //may not be valid, realm recycled?
world = RealmManager.PlayerWorldMapping[this.AccountId]; //also reconnecting to vault is a little unexpected
else if (world.Id == -5 || world.Id == -11)
world = RealmManager.GetWorld(World.NEXUS_ID);
else
world = RealmManager.GetWorld(World.NEXUS_ID);
} break;
case 0x0712:
world = RealmManager.GetWorld(World.NEXUS_ID); break;
case 0x071d:
world = RealmManager.GetWorld(World.NEXUS_ID); break;
case 0x071c:
world = RealmManager.Monitor.GetRandomRealm(); break;
case 0x0720:
world = RealmManager.PlayerVault(psr);
setWorldInstance = false; break;
case 0x071e:
world = RealmManager.AddWorld(new Kitchen()); break;
case 0x0ffa: //these need to match IDs
//world = RealmManager.GetWorld(World.GauntletMap); break; //this creates a singleton dungeon
world = RealmManager.AddWorld(new Island()); break; //this allows each dungeon to be unique
case 0x0ffc:
world = RealmManager.AddWorld(new WineCellarMap()); break;
case 0x1900:
world = RealmManager.AddWorld(new ArenaMap()); break;
case 0x0730:
world = RealmManager.AddWorld(new OceanTrench()); break;
case 0x070c:
world = RealmManager.AddWorld(new SpriteWorld()); break;
case 0x071b:
world = RealmManager.AddWorld(new Abyss()); break;
case 0x071a:
world = RealmManager.AddWorld(new UndeadLair()); break;
case 0x1901:
world = RealmManager.AddWorld(new VoidWorld()); break;
case 0x072c:
world = RealmManager.AddWorld(new TombMap()); break;
case 0x0742:
world = RealmManager.AddWorld(new BeachZone()); break;
case 0x0718:
world = RealmManager.AddWorld(new SnakePit()); break;
case 0x0890:
world = RealmManager.AddWorld(new MadLabMap()); break;
case 0x1905:
if (player.Client.Account.Stats.TotalFame > 100)
{
using (var db = new Database())
{
world = RealmManager.AddWorld(new BattleArenaMap());
setWorldInstance = false;
db.UpdateFame(player.Client.Account, -100);
}
}
else
{
player.SendError("Not Enough Fame!");
}
break;
case 0x1919:
world = RealmManager.AddWorld(new Secret()); break;
case 0x1923:
world = RealmManager.AddWorld(new ZombieMap()); break;
default: SendError("Portal Not Implemented!"); break;
case 0x195d:
world = RealmManager.AddWorld(new MarketMap()); break;
case 0x070d:
world = RealmManager.Monitor.GetRandomRealm(); break;
case 0x070e:
world = RealmManager.Monitor.GetRandomRealm(); break;
case 0x0704:
world = RealmManager.Monitor.GetRandomRealm(); break;
case 0x753E:
world = RealmManager.AddWorld(new LairofDraconis()); break;
case 0x7002:
world = RealmManager.AddWorld(new PartyCellarMap()); break;
}
}
if(setWorldInstance)
p.WorldInstance = world;
}
else
{
switch (entity.ObjectType) // Special Portals that cannot be the portal class
{
case 0x072f:
world = RealmManager.GuildHallWorld(Guild);
break;
default: psr.SendPacket(new TextPacket
{
BubbleTime = 0,
Stars = -1,
Name = "",
Text = "Semi-Portal Not Implemented!"
}); break;
}
}
}
//used to match up player to last realm they were in, to return them to it. Sometimes is odd, like from Vault back to Vault...
if (RealmManager.PlayerWorldMapping.ContainsKey(this.AccountId))
{
World tempWorld;
RealmManager.PlayerWorldMapping.TryRemove(this.AccountId, out tempWorld);
}
RealmManager.PlayerWorldMapping.TryAdd(this.AccountId, Owner);
psr.Reconnect(new ReconnectPacket()
{
Host = "",
Port = 2050,
GameId = world.Id,
Name = world.Name,
Key = Empty<byte>.Array,
});
}