Esempio n. 1
0
        public void HandleAxisCollision(int axis, float move, ref Vector3 position, bool isSmoothRising)
        {
            Vector3 boxSize = BoxSize;

            m_collisionBoxes.Clear();
            if (IsSneaking && axis != 1)
            {
                FindSneakCollisionBoxes(position, new Vector2(boxSize.X - 0.08f, boxSize.Z - 0.08f), m_collisionBoxes);
            }
            Vector3 v;

            switch (axis)
            {
            case 0:
                position.X += move;
                v           = new Vector3(0f, 0.04f, 0.04f);
                break;

            case 1:
                position.Y += move;
                v           = new Vector3(0.04f, 0f, 0.04f);
                break;

            default:
                position.Z += move;
                v           = new Vector3(0.04f, 0.04f, 0f);
                break;
            }
            BoundingBox boundingBox = new BoundingBox(position - new Vector3(boxSize.X / 2f, 0f, boxSize.Z / 2f) + v, position + new Vector3(boxSize.X / 2f, boxSize.Y, boxSize.Z / 2f) - v);

            FindTerrainCollisionBoxes(boundingBox, m_collisionBoxes);
            m_collisionBoxes.AddRange(m_movingBlocksCollisionBoxes);
            float        num;
            CollisionBox pushingCollisionBox;

            if ((axis != 1) | isSmoothRising)
            {
                BoundingBox smoothRiseBox = boundingBox;
                smoothRiseBox.Min.Y += MaxSmoothRiseHeight;
                num = CalculateSmoothRisePushBack(boundingBox, smoothRiseBox, axis, m_collisionBoxes, out pushingCollisionBox);
            }
            else
            {
                num = CalculatePushBack(boundingBox, axis, m_collisionBoxes, out pushingCollisionBox);
            }
            BoundingBox  box = new BoundingBox(position - new Vector3(boxSize.X / 2f, 0f, boxSize.Z / 2f) + v, position + new Vector3(boxSize.X / 2f, boxSize.Y, boxSize.Z / 2f) - v);
            CollisionBox pushingCollisionBox2;
            float        num2 = CalculatePushBack(box, axis, m_bodiesCollisionBoxes, out pushingCollisionBox2);

            if (MathUtils.Abs(num) > MathUtils.Abs(num2))
            {
                if (num == 0f)
                {
                    return;
                }
                int num3 = Terrain.ExtractContents(pushingCollisionBox.BlockValue);
                if (BlocksManager.Blocks[num3].HasCollisionBehavior)
                {
                    SubsystemBlockBehavior[] blockBehaviors = m_subsystemBlockBehaviors.GetBlockBehaviors(num3);
                    for (int i = 0; i < blockBehaviors.Length; i++)
                    {
                        Vector3  vector   = (pushingCollisionBox.Box.Min + pushingCollisionBox.Box.Max) / 2f;
                        CellFace cellFace = CellFace.FromAxisAndDirection(Terrain.ToCell(vector.X), Terrain.ToCell(vector.Y), Terrain.ToCell(vector.Z), axis, 0f - GetVectorComponent(m_velocity, axis));
                        blockBehaviors[i].OnCollide(cellFace, GetVectorComponent(m_velocity, axis), this);
                    }
                }
                switch (axis)
                {
                case 0:
                    position.X  += num;
                    m_velocity.X = pushingCollisionBox.BlockVelocity.X;
                    break;

                case 1:
                    position.Y  += num;
                    m_velocity.Y = pushingCollisionBox.BlockVelocity.Y;
                    if (move < 0f)
                    {
                        StandingOnValue    = pushingCollisionBox.BlockValue;
                        StandingOnBody     = pushingCollisionBox.ComponentBody;
                        StandingOnVelocity = pushingCollisionBox.BlockVelocity;
                    }
                    break;

                default:
                    position.Z  += num;
                    m_velocity.Z = pushingCollisionBox.BlockVelocity.Z;
                    break;
                }
            }
            else
            {
                if (num2 == 0f)
                {
                    return;
                }
                ComponentBody componentBody = pushingCollisionBox2.ComponentBody;
                switch (axis)
                {
                case 0:
                    InelasticCollision(m_velocity.X, componentBody.m_velocity.X, Mass, componentBody.Mass, 0.5f, out m_velocity.X, out componentBody.m_velocity.X);
                    position.X += num2;
                    break;

                case 1:
                    InelasticCollision(m_velocity.Y, componentBody.m_velocity.Y, Mass, componentBody.Mass, 0.5f, out m_velocity.Y, out componentBody.m_velocity.Y);
                    position.Y += num2;
                    if (move < 0f)
                    {
                        StandingOnValue    = pushingCollisionBox2.BlockValue;
                        StandingOnBody     = pushingCollisionBox2.ComponentBody;
                        StandingOnVelocity = new Vector3(componentBody.m_velocity.X, 0f, componentBody.m_velocity.Z);
                    }
                    break;

                default:
                    InelasticCollision(m_velocity.Z, componentBody.m_velocity.Z, Mass, componentBody.Mass, 0.5f, out m_velocity.Z, out componentBody.m_velocity.Z);
                    position.Z += num2;
                    break;
                }
                if (this.CollidedWithBody != null)
                {
                    this.CollidedWithBody(componentBody);
                }
                if (componentBody.CollidedWithBody != null)
                {
                    componentBody.CollidedWithBody(this);
                }
            }
        }