OpenSim.Region.Framework.Scenes.ScenePresence.CheckForBorderCrossing C# (CSharp) Méthode

CheckForBorderCrossing() protected méthode

Checks to see if the avatar is in range of a border and calls CrossToNewRegion
protected CheckForBorderCrossing ( ) : void
Résultat void
        protected void CheckForBorderCrossing()
        {
            if (IsChildAgent)
                return;

            Vector3 pos2 = AbsolutePosition;
            Vector3 vel = Velocity;
            int neighbor = 0;
            int[] fix = new int[2];

            float timeStep = 0.1f;
            pos2.X = pos2.X + (vel.X*timeStep);
            pos2.Y = pos2.Y + (vel.Y*timeStep);
            pos2.Z = pos2.Z + (vel.Z*timeStep);

            if (!IsInTransit)
            {
                // Checks if where it's headed exists a region

                bool needsTransit = false;
                if (m_scene.TestBorderCross(pos2, Cardinals.W))
                {
                    if (m_scene.TestBorderCross(pos2, Cardinals.S))
                    {
                        needsTransit = true;
                        neighbor = HaveNeighbor(Cardinals.SW, ref fix);
                    }
                    else if (m_scene.TestBorderCross(pos2, Cardinals.N))
                    {
                        needsTransit = true;
                        neighbor = HaveNeighbor(Cardinals.NW, ref fix);
                    }
                    else
                    {
                        needsTransit = true;
                        neighbor = HaveNeighbor(Cardinals.W, ref fix);
                    }
                }
                else if (m_scene.TestBorderCross(pos2, Cardinals.E))
                {
                    if (m_scene.TestBorderCross(pos2, Cardinals.S))
                    {
                        needsTransit = true;
                        neighbor = HaveNeighbor(Cardinals.SE, ref fix);
                    }
                    else if (m_scene.TestBorderCross(pos2, Cardinals.N))
                    {
                        needsTransit = true;
                        neighbor = HaveNeighbor(Cardinals.NE, ref fix);
                    }
                    else
                    {
                        needsTransit = true;
                        neighbor = HaveNeighbor(Cardinals.E, ref fix);
                    }
                }
                else if (m_scene.TestBorderCross(pos2, Cardinals.S))
                {
                    needsTransit = true;
                    neighbor = HaveNeighbor(Cardinals.S, ref fix);
                }
                else if (m_scene.TestBorderCross(pos2, Cardinals.N))
                {
                    needsTransit = true;
                    neighbor = HaveNeighbor(Cardinals.N, ref fix);
                }


                // Makes sure avatar does not end up outside region
                if (neighbor <= 0)
                {
                    if (!needsTransit)
                    {
                        if (m_requestedSitTargetUUID == UUID.Zero)
                        {
                            Vector3 pos = AbsolutePosition;
                            if (AbsolutePosition.X < 0)
                                pos.X += Velocity.X;
                            else if (AbsolutePosition.X > Constants.RegionSize)
                                pos.X -= Velocity.X;
                            if (AbsolutePosition.Y < 0)
                                pos.Y += Velocity.Y;
                            else if (AbsolutePosition.Y > Constants.RegionSize)
                                pos.Y -= Velocity.Y;
                            AbsolutePosition = pos;
                        }
                    }
                }
                else if (neighbor > 0)
                    CrossToNewRegion();
            }
            else
            {
                RemoveFromPhysicalScene();
                // This constant has been inferred from experimentation
                // I'm not sure what this value should be, so I tried a few values.
                timeStep = 0.04f;
                pos2 = AbsolutePosition;
                pos2.X = pos2.X + (vel.X * timeStep);
                pos2.Y = pos2.Y + (vel.Y * timeStep);
                pos2.Z = pos2.Z + (vel.Z * timeStep);
                m_pos = pos2;
            }
        }
ScenePresence