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); } } }