Exemplo n.º 1
0
        public void TeleportToRoom(PlayerController targetPlayer, RoomHandler targetRoom, bool isSecondaryPlayer = false, bool isCorruptedRoomCopy = false, Vector2?overridePosition = null)
        {
            m_IsTeleporting = true;
            bool       m_NeedsNewPosition = false;
            Vector2    OldPosition        = (targetPlayer.transform.position - targetPlayer.CurrentRoom.area.basePosition.ToVector3());
            IntVector2 OldPositionIntVec2 = (targetPlayer.CenterPosition.ToIntVector2() - targetPlayer.CurrentRoom.area.basePosition);
            Vector2    NewPosition        = (OldPosition + targetRoom.area.basePosition.ToVector2());

            if (overridePosition.HasValue)
            {
                NewPosition = (overridePosition.Value + targetRoom.area.basePosition.ToVector2());
            }
            else
            {
                if (isCorruptedRoomCopy && !GameManager.Instance.Dungeon.data.isPlainEmptyCell(OldPositionIntVec2.x + targetRoom.area.basePosition.x, OldPositionIntVec2.y + targetRoom.area.basePosition.y))
                {
                    m_NeedsNewPosition = true;
                }
                else if (!isCorruptedRoomCopy)
                {
                    m_NeedsNewPosition = true;
                }
                if (m_NeedsNewPosition)
                {
                    IntVector2?randomAvailableCell = ExpandUtility.GetRandomAvailableCellForPlayer(GameManager.Instance.Dungeon, targetRoom);
                    if (randomAvailableCell.HasValue)
                    {
                        NewPosition = randomAvailableCell.Value.ToVector3();
                    }
                    else
                    {
                        randomAvailableCell = ExpandUtility.GetRandomAvailableCellSmart(targetRoom, new IntVector2(2, 3));
                    }
                    if (!randomAvailableCell.HasValue)
                    {
                        m_IsTeleporting = false;
                        return;
                    }
                }
            }

            if (GameManager.Instance.CurrentGameType == GameManager.GameType.COOP_2_PLAYER && !isSecondaryPlayer)
            {
                PlayerController otherPlayer = GameManager.Instance.GetOtherPlayer(targetPlayer);
                if (otherPlayer)
                {
                    TeleportToRoom(otherPlayer, targetRoom, true, true);
                }
            }
            targetPlayer.DoVibration(Vibration.Time.Normal, Vibration.Strength.Medium);
            GameManager.Instance.StartCoroutine(HandleTeleportToRoom(targetPlayer, NewPosition));
            targetPlayer.specRigidbody.Velocity = Vector2.zero;
            targetPlayer.knockbackDoer.TriggerTemporaryKnockbackInvulnerability(1f);
            targetRoom.EnsureUpstreamLocksUnlocked();
        }