Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
                }
            }
        }