void OnTeleportFinished(string message, OpenMetaverse.AgentManager.TeleportStatus status, OpenMetaverse.AgentManager.TeleportFlags flags) { if (status == AgentManager.TeleportStatus.Finished) { // Happily ever after OpenMetaverse.Packets.UseCircuitCodePacket uccp = new OpenMetaverse.Packets.UseCircuitCodePacket(); uccp.CircuitCode.Code = avatarConnection.m_user.Network.CircuitCode; uccp.CircuitCode.ID = avatarConnection.m_user.Self.AgentID; uccp.CircuitCode.SessionID = avatarConnection.m_user.Self.SessionID; avatarConnection.m_user.Network.SendPacket(uccp, avatarConnection.m_user.Network.CurrentSim); if (teleportDestinationIsNeighboring) { // WARNING: unfortunately, sometimes libomv does generate a OnNewPrim callback // after teleport to a neighboring region (though usually it does not). The effect // of this is a redundant deletion/insertion of a prim; libomv adds the prim itself // through the OnNewPrim callback, then we add it again here with a fake callback, // which causes the prim to be removed from the scene and re-added. GenerateFakeCallbacksForNeighboringTeleportFinished(); } else { Simulator currentSim = avatarConnection.m_user.Network.CurrentSim; if (DetachedSims.ContainsKey(currentSim.Handle)) { // Fabricate RegionHandshakeReply to make OpenSim to emit LayerData packets again OpenMetaverse.Packets.RegionHandshakeReplyPacket reply = new OpenMetaverse.Packets.RegionHandshakeReplyPacket(); reply.AgentData.AgentID = avatarConnection.m_user.Self.AgentID; reply.AgentData.SessionID = avatarConnection.m_user.Self.SessionID; reply.RegionInfo.Flags = 0; avatarConnection.m_user.Network.SendPacket(reply, avatarConnection.m_user.Network.CurrentSim); avatarConnection.m_user.Self.CompleteAgentMovement(currentSim); avatarConnection.m_user.Self.Movement.SendUpdate(); avatarConnection.m_user.Self.Movement.SendUpdate(); avatarConnection.m_user.Self.Movement.SendUpdate(); // Recover missing avatars and prims which have arrived after teleport request and before the teleport finish Simulator detached = DetachedSims[currentSim.Handle]; foreach (Avatar av in detached.ObjectsAvatars.FindAll(delegate(Avatar a) { return true; })) { OnNewAvatar(currentSim, av, currentSim.Handle, (ushort)(currentSim.Stats.Dilation * 65535.0f)); } foreach (Primitive prim in detached.ObjectsPrimitives.FindAll(delegate(Primitive p) { return true; })) { OnNewPrim_warning(currentSim, prim, prim.RegionHandle, (ushort)(currentSim.Stats.Dilation * 65535.0f)); } // Recover the region name, but why currentSim.Name is empty for the first place? currentSim.Name = DetachedSims[currentSim.Handle].Name; } } Reference.Viewer.Adapter.CallTeleported( avatarConnection.m_user.Self.AgentID.ToString(), avatarConnection.username, (int)avatarConnection.m_user.Self.SimPosition.X, (int)avatarConnection.m_user.Self.SimPosition.Y, (int)avatarConnection.m_user.Self.SimPosition.Z ); //Reference.Viewer.StateManager.State = State.CONNECTED; // don't do this here -> wait until terrain has finished downloading (see OnLandPatch) } else { // Teleport failed, so we need to add back the scene that we just deleted teleportDestinationIsNeighboring = true; // turn on this flag to return back current sim GenerateFakeCallbacksForNeighboringTeleportFinished(); Reference.Viewer.GuiManager.ShowTeleportFailedWindow(message); } Reference.Viewer.EffectManager.FadeIn(TeleportedEventHandler); }
public void RerequestTerrain() { // Check if we are connected and if land patches are being received already if (avatarConnection.m_user.Network.CurrentSim != null) { //if (receivedPatches.ContainsKey(avatarConnection.m_user.Network.CurrentSim.Handle) && receivedPatches[avatarConnection.m_user.Network.CurrentSim.Handle] != 0) if (receivedPatchesDetail.ContainsKey(avatarConnection.m_user.Network.CurrentSim.Handle) && receivedPatchesDetail[avatarConnection.m_user.Network.CurrentSim.Handle].Count != 0) { Reference.Log.Debug("[NOTIFICATION]: Logging in takes longer than 5 seconds."); } else { Reference.Log.Debug("[NOTIFICATION]: Login progress was halted. Rerequesting terrain data."); OpenMetaverse.Simulator simulator = avatarConnection.m_user.Network.CurrentSim; OpenMetaverse.Packets.RegionHandshakeReplyPacket reply = new OpenMetaverse.Packets.RegionHandshakeReplyPacket(); reply.AgentData.AgentID = avatarConnection.m_user.Self.Client.Self.AgentID; reply.AgentData.SessionID = avatarConnection.m_user.Self.Client.Self.SessionID; reply.RegionInfo.Flags = 0; avatarConnection.m_user.Self.Client.Network.SendPacket(reply, simulator); } } }