void WServer::HandleTeleportRequest(WorldPacket & pck) { WorldPacket data(ISMSG_TELEPORT_RESULT, 100); RPlayerInfo * pi; Session * s; Instance * dest; uint32 mapid, sessionid, instanceid; /* this packet is only used upon changing main maps! */ pck >> sessionid >> mapid >> instanceid; s = sClientMgr.GetSession(sessionid); if(s) { pi = s->GetPlayer(); ASSERT(pi); /* find the destination server */ if(instanceid == 0) dest = sClusterMgr.GetInstanceByMapId(mapid); else dest = sClusterMgr.GetInstanceByInstanceId(instanceid); /* server up? */ if(!dest) { data.Initialize(SMSG_TRANSFER_ABORTED); data << uint32(0x02); // INSTANCE_ABORT_NOT_FOUND s->SendPacket(&data); } else { /* server found! */ LocationVector vec; pck >> vec >> vec.o; pi->MapId = mapid; pi->InstanceId = dest->InstanceId; pi->PositionX = vec.x; pi->PositionY = vec.y; if(dest->Server == s->GetServer()) { /* we're not changing servers, the new instance is on the same server */ data << sessionid << uint8(1) << mapid << instanceid << vec << vec.o; SendPacket(&data); } else { /* notify the old server to pack the player info together to send to the new server, and delete the player */ data << sessionid << uint8(0) << mapid << instanceid << vec << vec.o; SendPacket(&data); } data.Initialize(ISMSG_PLAYER_INFO); pi->Pack(data); sClusterMgr.DistributePacketToAll(&data, this); data.Initialize(SMSG_NEW_WORLD); data << mapid << vec << vec.o; s->SendPacket(&data); } } }
void WServer::HandleTeleportRequest(WorldPacket & pck) { WorldPacket data(ISMSG_TELEPORT_RESULT, 100); RPlayerInfo * pi; Session * s; Instance * dest; uint32 mapid, sessionid, instanceid; /* this packet is only used upon changing main maps! */ pck >> sessionid >> mapid >> instanceid; DEBUG_LOG("TeleportRequest", "session %u, mapid %u, instanceid %u", sessionid, mapid, instanceid); s = sClientMgr.GetSession(sessionid); if(s) { pi = s->GetPlayer(); ASSERT(pi); if(IS_MAIN_MAP(mapid) || instanceid == 0) { /* we're on a continent, try to find the world server we're going to */ dest = sClusterMgr.GetInstanceByMapId(mapid); } else { /* we're in an instanced map, try to find the world server we're going to */ dest = sClusterMgr.GetInstanceByInstanceId(instanceid); } //try and find a prototype instance, and its server if (dest == NULL) { DEBUG_LOG("TeleportRequest", "Could not find instance, will use prototype..."); dest = sClusterMgr.GetPrototypeInstanceByMapId(mapid); } /* server up? */ if(!dest) { DEBUG_LOG("TeleportRequest", "INSTANCE_ABORT_NOT_FOUND"); data.Initialize(SMSG_TRANSFER_ABORTED); data << uint32(0x02); // INSTANCE_ABORT_NOT_FOUND s->SendPacket(&data); } else { /* server found! */ LocationVector vec; pck >> vec >> vec.o; pi->MapId = mapid; pi->InstanceId = dest->InstanceId; pi->PositionX = vec.x; pi->PositionY = vec.y; if(dest->Server == s->GetServer()) { DEBUG_LOG("TeleportRequest", "intra-server teleport"); /* we're not changing servers, the new instance is on the same server */ data << sessionid << uint8(1) << mapid << instanceid << vec << vec.o; SendPacket(&data); } else { DEBUG_LOG("TeleportRequest", "inter-server teleport"); /* notify the old server to pack the player info together to send to the new server, and delete the player */ data << sessionid << uint8(0) << mapid << instanceid << vec << vec.o; //cache this to next server and switch servers when were ready :P s->SetNextServer(dest->Server); SendPacket(&data); } data.Initialize(ISMSG_PLAYER_INFO); pi->Pack(data); sClusterMgr.DistributePacketToAll(&data, this); data.Initialize(SMSG_NEW_WORLD); data << mapid << vec << vec.o; s->SendPacket(&data); } } }