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