Files

786 lines
29 KiB
C#
Raw Permalink Normal View History

using UnityEngine;
using System.Collections;
public class moveCameraToDevice : MonoBehaviour
{
public bool cameraMovementActive = true;
public GameObject cameraPosition;
public bool smoothCameraMovement = true;
public bool useFixedLerpMovement = true;
public float fixedLerpMovementSpeed = 2;
public float cameraMovementSpeedThirdPerson = 1;
public float cameraMovementSpeedFirstPerson = 0.2f;
public bool secondMoveCameraToDevice;
public bool unlockCursor = true;
public bool ignoreHideCursorOnClick;
public bool setNewMouseCursorControllerSpeed;
public float newMouseCursroControllerSpeed;
public bool disablePlayerMeshGameObject = true;
public bool enablePlayerMeshGameObjectIfFirstPersonActive;
public bool ignoreFBAActiveIfDisablePlayerMesh;
public bool ignoreCameraPositionAdjusmentOnFBA;
public bool disableWeaponsCamera;
public bool keepWeaponsIfCarrying;
public bool drawWeaponsIfPreviouslyCarrying;
public bool keepOnlyIfPlayerIsOnFirstPerson;
public bool disableWeaponsDirectlyOnStart;
bool carryingWeaponsPreviously;
bool firstPersonActive;
public bool ignoreMeleeWeaponCheck;
public bool carryWeaponOnLowerPositionActive;
public bool setPlayerCameraRotationOnExit;
public Transform playerPivotTransformThirdPerson;
public Transform playerCameraTransformThirdPerson;
public Transform playerPivotTransformFirstPerson;
public Transform playerCameraTransformFirstPerson;
public bool alignPlayerWithCameraPositionOnStartUseDevice;
public bool alignPlayerWithCameraPositionOnStopUseDevice;
public bool alignPlayerWithCameraRotationOnStartUseDevice;
public bool alignPlayerWithCameraRotationOnStopUseDevice;
public Transform customAlignPlayerTransform;
public bool resetPlayerCameraDirection;
public bool disableSecondaryPlayerHUD = true;
public bool disableAllPlayerHUD;
public bool disableTouchControls;
public bool disableAllDynamicUIElements = true;
public bool disableInteractionTouchButtonOnUsingDevice;
public bool showGizmo;
public float gizmoRadius = 0.1f;
public Color gizmoLabelColor = Color.black;
public float gizmoArrowLength = 0.3f;
public float gizmoArrowLineLength = 0.5f;
public float gizmoArrowAngle = 20;
public Color gizmoArrowColor = Color.white;
Transform cameraParentTransform;
Vector3 mainCameraTargetPosition;
Quaternion mainCameraTargetRotation;
Coroutine cameraState;
bool deviceEnabled;
Camera mainCamera;
menuPause pauseManager;
GameObject currentPlayer;
playerController currentPlayerControllerManager;
playerWeaponsManager weaponsManager;
usingDevicesSystem usingDevicesManager;
headBob headBobManager;
grabObjects grabObjectsManager;
footStepManager stepManager;
playerCamera playerCameraManager;
headTrack headTrackManager;
playerComponentsManager mainPlayerComponentsManager;
bool previouslyIconButtonActive;
bool movingCamera;
Coroutine headTrackTargetCoroutine;
Transform headTrackTargeTransform;
//this function was placed in computer device, but now it can be added to any type of device when the player is using it,
//to move the camera position and rotation in front of the device and place it again in its regular place when the player stops using the device
bool ignoreDisablePlayerMeshResult;
bool weaponCursorActiveSelfState;
void Start ()
{
mainCameraTargetRotation = Quaternion.identity;
mainCameraTargetPosition = Vector3.zero;
}
public bool ignoreMoveCameraFunctionEnabled;
//activate the device
public void moveCamera (bool state)
{
if (ignoreMoveCameraFunctionEnabled) {
return;
}
if (deviceEnabled == state && !secondMoveCameraToDevice) {
return;
}
deviceEnabled = state;
if (deviceEnabled) {
headBobManager.stopAllHeadbobMovements ();
}
headBobManager.playOrPauseHeadBob (!state);
//if the player is using the computer, disable the player controller, the camera, and set the parent of the camera inside the computer,
//to move to its view position
if (cameraPosition == null) {
cameraPosition = gameObject;
}
if (deviceEnabled) {
if (playerCameraManager.isLeanActive ()) {
playerCameraManager.checkResetLeanState (true);
playerCameraManager.removeLeanRotationFromPivotCameraTransform ();
playerCameraManager.updateFBAPivotCameraTransformValuesToMainPivotCameraTransform ();
}
if (currentPlayerControllerManager.isPlayerRunning ()) {
currentPlayerControllerManager.stopRun ();
}
if (!secondMoveCameraToDevice) {
//make the mouse cursor visible according to the action of the player
currentPlayerControllerManager.setUsingDeviceState (deviceEnabled);
ignoreDisablePlayerMeshResult = false;
weaponsManager.setUsingDeviceState (deviceEnabled);
carryingWeaponsPreviously = weaponsManager.isUsingWeapons ();
bool playerShootingPreviously = weaponsManager.isCharacterShooting () ||
weaponsManager.isReloadingWithAnimationActive ();
if (carryingWeaponsPreviously) {
weaponsManager.stopShootingFireWeaponIfActiveWithoutChangingAimState ();
weaponsManager.cancelReloadIfActive ();
if (playerShootingPreviously) {
ignoreDisablePlayerMeshResult = true;
}
}
if (keepWeaponsIfCarrying) {
firstPersonActive = currentPlayerControllerManager.isPlayerOnFirstPerson ();
if (!keepOnlyIfPlayerIsOnFirstPerson || firstPersonActive) {
if (carryingWeaponsPreviously) {
if (disableWeaponsDirectlyOnStart) {
weaponsManager.checkIfDisableCurrentWeapon ();
} else {
weaponsManager.checkIfKeepSingleOrDualWeapon ();
}
}
}
}
weaponCursorActiveSelfState = weaponsManager.getGeneralWeaponCursorActiveSelfState ();
if (weaponCursorActiveSelfState) {
weaponsManager.enableOrDisableGeneralWeaponCursor (false);
}
if (disableWeaponsCamera) {
if (weaponsManager.carryingWeaponInFirstPerson) {
weaponsManager.weaponsCamera.gameObject.SetActive (false);
}
}
pauseManager.usingDeviceState (deviceEnabled);
currentPlayerControllerManager.changeScriptState (!deviceEnabled);
bool isFullBodyAwarenessActive = currentPlayerControllerManager.isFullBodyAwarenessActive () && !ignoreFBAActiveIfDisablePlayerMesh;
if (disablePlayerMeshGameObject && !isFullBodyAwarenessActive) {
if (!ignoreDisablePlayerMeshResult) {
currentPlayerControllerManager.getGravityCenter ().gameObject.SetActive (!deviceEnabled);
}
}
if (enablePlayerMeshGameObjectIfFirstPersonActive) {
if (firstPersonActive && !isFullBodyAwarenessActive) {
currentPlayerControllerManager.setCharacterMeshGameObjectState (true);
}
}
stepManager.enableOrDisableFootStepsComponents (!deviceEnabled);
if (unlockCursor) {
pauseManager.showOrHideCursor (deviceEnabled);
}
pauseManager.changeCameraState (!deviceEnabled);
}
if (!ignoreMeleeWeaponCheck) {
grabObjectsManager.checkToDropObjectIfNotPhysicalWeaponElseKeepWeapon ();
}
previouslyIconButtonActive = usingDevicesManager.getCurrentIconButtonState ();
if (disableInteractionTouchButtonOnUsingDevice) {
usingDevicesManager.setIconButtonCanBeShownState (false);
}
if (cameraMovementActive) {
if (cameraParentTransform == null) {
cameraParentTransform = mainCamera.transform.parent;
mainCamera.transform.SetParent (cameraPosition.transform);
}
}
if (alignPlayerWithCameraPositionOnStartUseDevice) {
Vector3 playerTargetPosition = Vector3.zero;
if (customAlignPlayerTransform != null) {
playerTargetPosition =
new Vector3 (customAlignPlayerTransform.position.x, currentPlayer.transform.position.y, customAlignPlayerTransform.position.z);
} else {
playerTargetPosition =
new Vector3 (cameraPosition.transform.position.x, currentPlayer.transform.position.y, cameraPosition.transform.position.z);
}
currentPlayer.transform.position = playerTargetPosition;
playerCameraManager.transform.position = currentPlayer.transform.position;
}
if (alignPlayerWithCameraRotationOnStartUseDevice) {
Vector3 playerTargetRotation = Vector3.zero;
if (customAlignPlayerTransform != null) {
playerTargetRotation =
new Vector3 (currentPlayer.transform.eulerAngles.x, customAlignPlayerTransform.eulerAngles.y, currentPlayer.transform.eulerAngles.z);
} else {
playerTargetRotation =
new Vector3 (currentPlayer.transform.eulerAngles.x, cameraPosition.transform.eulerAngles.y, currentPlayer.transform.eulerAngles.z);
}
currentPlayer.transform.eulerAngles = playerTargetRotation;
playerCameraManager.transform.eulerAngles = currentPlayer.transform.eulerAngles;
}
if (resetPlayerCameraDirection) {
playerCameraManager.setLookAngleValue (Vector2.zero);
playerCameraManager.resetCurrentCameraStateAtOnce ();
playerCameraManager.getPivotCameraTransform ().localRotation = Quaternion.identity;
}
} else {
//set player camera rotation when the player stops using the device
if (setPlayerCameraRotationOnExit) {
bool isFirstPersonActive = playerCameraManager.isFirstPersonActive ();
Vector3 pivotCameraRotation = Vector3.zero;
Vector3 cameraRotation = Vector3.zero;
if (isFirstPersonActive) {
cameraRotation = playerCameraTransformFirstPerson.eulerAngles;
pivotCameraRotation = playerPivotTransformFirstPerson.localEulerAngles;
} else {
cameraRotation = playerCameraTransformThirdPerson.eulerAngles;
pivotCameraRotation = playerPivotTransformThirdPerson.localEulerAngles;
}
playerCameraManager.transform.eulerAngles = cameraRotation;
playerCameraManager.getPivotCameraTransform ().localEulerAngles = pivotCameraRotation;
float newLookAngleValue = pivotCameraRotation.x;
if (newLookAngleValue > 180) {
newLookAngleValue -= 360;
}
playerCameraManager.setLookAngleValue (new Vector2 (0, newLookAngleValue));
playerCameraManager.setCurrentCameraUpRotationValue (0);
}
//if the player disconnect the computer, then enabled of its components and set the camera to its previous position inside the player
if (!secondMoveCameraToDevice) {
//make the mouse cursor visible according to the action of the player
currentPlayerControllerManager.setUsingDeviceState (deviceEnabled);
pauseManager.usingDeviceState (deviceEnabled);
currentPlayerControllerManager.changeScriptState (!deviceEnabled);
if (disableWeaponsCamera) {
if (weaponsManager.carryingWeaponInFirstPerson) {
weaponsManager.weaponsCamera.gameObject.SetActive (true);
}
}
bool isFullBodyAwarenessActive = currentPlayerControllerManager.isFullBodyAwarenessActive () && !ignoreFBAActiveIfDisablePlayerMesh;
if (disablePlayerMeshGameObject && !isFullBodyAwarenessActive) {
if (!ignoreDisablePlayerMeshResult) {
currentPlayerControllerManager.getGravityCenter ().gameObject.SetActive (!deviceEnabled);
}
}
if (enablePlayerMeshGameObjectIfFirstPersonActive) {
if (firstPersonActive && !isFullBodyAwarenessActive) {
currentPlayerControllerManager.setCharacterMeshGameObjectState (false);
}
}
weaponsManager.setUsingDeviceState (deviceEnabled);
if (keepWeaponsIfCarrying) {
if (!keepOnlyIfPlayerIsOnFirstPerson || firstPersonActive) {
if (drawWeaponsIfPreviouslyCarrying && carryingWeaponsPreviously) {
weaponsManager.checkIfDrawSingleOrDualWeapon ();
}
}
}
if (weaponCursorActiveSelfState) {
weaponsManager.enableOrDisableGeneralWeaponCursor (true);
}
stepManager.enableOrDisableFootStepsWithDelay (!deviceEnabled, 0);
if (unlockCursor) {
pauseManager.showOrHideCursor (deviceEnabled);
}
pauseManager.changeCameraState (!deviceEnabled);
}
if (cameraMovementActive) {
if (alignPlayerWithCameraPositionOnStopUseDevice) {
Vector3 playerTargetPosition = Vector3.zero;
if (customAlignPlayerTransform != null) {
playerTargetPosition =
new Vector3 (customAlignPlayerTransform.position.x, currentPlayer.transform.position.y, customAlignPlayerTransform.position.z);
currentPlayer.transform.position = playerTargetPosition;
} else {
float xPosition = currentPlayer.transform.InverseTransformPoint (mainCamera.transform.position).x;
float zPosition = currentPlayer.transform.InverseTransformPoint (mainCamera.transform.position).z;
currentPlayer.transform.position += currentPlayer.transform.right * xPosition + currentPlayer.transform.forward * zPosition;
}
playerCameraManager.transform.position = currentPlayer.transform.position;
}
if (alignPlayerWithCameraRotationOnStopUseDevice) {
Vector3 playerTargetRotation = Vector3.zero;
if (customAlignPlayerTransform != null) {
playerTargetRotation =
new Vector3 (currentPlayer.transform.eulerAngles.x, customAlignPlayerTransform.eulerAngles.y, currentPlayer.transform.eulerAngles.z);
} else {
playerTargetRotation =
new Vector3 (currentPlayer.transform.eulerAngles.x, cameraPosition.transform.eulerAngles.y, currentPlayer.transform.eulerAngles.z);
}
currentPlayer.transform.eulerAngles = playerTargetRotation;
playerCameraManager.transform.rotation = currentPlayer.transform.rotation;
}
if (cameraParentTransform != null) {
mainCamera.transform.SetParent (cameraParentTransform);
cameraParentTransform = null;
}
}
usingDevicesManager.setIconButtonCanBeShownState (previouslyIconButtonActive);
usingDevicesManager.checkIfRemoveDeviceFromList ();
}
if (disableAllDynamicUIElements) {
pauseManager.enableOrDisableDynamicElementsOnScreen (!deviceEnabled);
}
if (disableAllPlayerHUD) {
pauseManager.enableOrDisablePlayerHUD (!deviceEnabled);
} else {
if (disableSecondaryPlayerHUD) {
pauseManager.enableOrDisableSecondaryPlayerHUD (!deviceEnabled);
}
}
if (disableTouchControls) {
if (pauseManager.isUsingTouchControls ()) {
pauseManager.enableOrDisableTouchControlsExternally (!deviceEnabled);
}
}
if (cameraMovementActive) {
if (smoothCameraMovement) {
//stop the coroutine to translate the camera and call it again
if (cameraState != null) {
StopCoroutine (cameraState);
}
cameraState = StartCoroutine (adjustCamera ());
if (headTrackManager.useHeadTrackTarget) {
headTrackTargeTransform = headTrackManager.getHeadTrackTargetTransform ();
if (headTrackTargetCoroutine != null) {
StopCoroutine (headTrackTargetCoroutine);
}
headTrackTargetCoroutine = StartCoroutine (adjustHeadTrackTarget ());
}
} else {
mainCamera.transform.localRotation = mainCameraTargetRotation;
mainCamera.transform.localPosition = mainCameraTargetPosition;
if (headTrackManager.useHeadTrackTarget) {
headTrackTargeTransform = headTrackManager.getHeadTrackTargetTransform ();
if (deviceEnabled) {
headTrackTargeTransform.SetParent (cameraPosition.transform);
headTrackTargeTransform.localPosition = mainCameraTargetPosition;
} else {
headTrackTargeTransform.SetParent (headTrackManager.getHeadTrackTargetParent ());
headTrackTargeTransform.localPosition = headTrackManager.getOriginalHeadTrackTargetPosition ();
}
}
}
}
if (unlockCursor) {
pauseManager.showOrHideMouseCursorController (deviceEnabled);
if (setNewMouseCursorControllerSpeed) {
if (deviceEnabled) {
pauseManager.setMouseCursorControllerSpeedOnGameValue (newMouseCursroControllerSpeed);
} else {
pauseManager.setOriginalMouseCursorControllerSpeedOnGameValue ();
}
}
if (ignoreHideCursorOnClick) {
pauseManager.setIgnoreHideCursorOnClickActiveState (deviceEnabled);
}
}
pauseManager.checkEnableOrDisableTouchZoneList (!deviceEnabled);
}
//move the camera from its position in player camera to a fix position for a proper looking of the computer and vice versa
IEnumerator adjustCamera ()
{
movingCamera = true;
Transform mainCameraTransform = mainCamera.transform;
bool ignoreCameraPosition = false;
if (ignoreCameraPositionAdjusmentOnFBA) {
if (currentPlayerControllerManager.isFullBodyAwarenessActive ()) {
ignoreCameraPosition = true;
}
}
bool useGlobalRotation = false;
Quaternion cameraRotationTarget = mainCameraTargetRotation;
if (deviceEnabled && ignoreCameraPosition) {
cameraRotationTarget = Quaternion.LookRotation (cameraPosition.transform.forward);
useGlobalRotation = true;
}
if (useFixedLerpMovement) {
float i = 0;
//store the current rotation of the camera
Quaternion currentQ = mainCameraTransform.localRotation;
if (useGlobalRotation) {
currentQ = mainCameraTransform.rotation;
}
//store the current position of the camera
Vector3 currentPos = mainCameraTransform.localPosition;
//translate position and rotation camera
while (i < 1) {
i += Time.deltaTime * fixedLerpMovementSpeed;
if (useGlobalRotation) {
mainCameraTransform.rotation = Quaternion.Lerp (currentQ, cameraRotationTarget, i);
} else {
mainCameraTransform.localRotation = Quaternion.Lerp (currentQ, cameraRotationTarget, i);
}
if (!ignoreCameraPosition) {
mainCameraTransform.localPosition = Vector3.Lerp (currentPos, mainCameraTargetPosition, i);
}
yield return null;
}
} else {
bool isFirstPersonActive = playerCameraManager.isFirstPersonActive ();
float currentCameraMovementSpeed = cameraMovementSpeedThirdPerson;
if (isFirstPersonActive) {
currentCameraMovementSpeed = cameraMovementSpeedFirstPerson;
}
float dist = GKC_Utils.distance (mainCameraTransform.localPosition, mainCameraTargetPosition);
float duration = dist / currentCameraMovementSpeed;
float t = 0;
float movementTimer = 0;
bool targetReached = false;
float angleDifference = 0;
float positionDifference = 0;
while (!targetReached) {
t += Time.deltaTime / duration;
if (!ignoreCameraPosition) {
mainCameraTransform.localPosition = Vector3.Lerp (mainCameraTransform.localPosition, mainCameraTargetPosition, t);
}
if (useGlobalRotation) {
mainCameraTransform.rotation = Quaternion.Lerp (mainCameraTransform.rotation, cameraRotationTarget, t);
} else {
mainCameraTransform.localRotation = Quaternion.Lerp (mainCameraTransform.localRotation, cameraRotationTarget, t);
}
angleDifference = Quaternion.Angle (mainCameraTransform.localRotation, cameraRotationTarget);
positionDifference = GKC_Utils.distance (mainCameraTransform.localPosition, mainCameraTargetPosition);
movementTimer += Time.deltaTime;
if (ignoreCameraPosition) {
if (angleDifference < 0.2f) {
targetReached = true;
}
} else {
if (positionDifference < 0.01f && angleDifference < 0.2f) {
targetReached = true;
}
}
if (movementTimer > (duration + 1)) {
targetReached = true;
}
yield return null;
}
}
movingCamera = false;
}
//move the camera from its position in player camera to a fix position for a proper looking of the computer and vice versa
IEnumerator adjustHeadTrackTarget ()
{
Vector3 targetPosition = mainCameraTargetPosition;
Quaternion targeRotation = Quaternion.identity;
headTrackTargeTransform.SetParent (cameraPosition.transform);
if (!deviceEnabled) {
targetPosition = headTrackManager.getOriginalHeadTrackTargetPosition ();
headTrackTargeTransform.SetParent (headTrackManager.getHeadTrackTargetParent ());
}
if (useFixedLerpMovement) {
float i = 0;
//store the current rotation of the camera
Quaternion currentQ = headTrackTargeTransform.localRotation;
//store the current position of the camera
Vector3 currentPos = headTrackTargeTransform.localPosition;
//translate position and rotation camera
while (i < 1) {
i += Time.deltaTime * fixedLerpMovementSpeed;
headTrackTargeTransform.localRotation = Quaternion.Lerp (currentQ, targeRotation, i);
headTrackTargeTransform.localPosition = Vector3.Lerp (currentPos, targetPosition, i);
yield return null;
}
} else {
bool isFirstPersonActive = playerCameraManager.isFirstPersonActive ();
float currentCameraMovementSpeed = cameraMovementSpeedThirdPerson;
if (isFirstPersonActive) {
currentCameraMovementSpeed = cameraMovementSpeedFirstPerson;
}
float dist = GKC_Utils.distance (headTrackTargeTransform.localPosition, targetPosition);
float duration = dist / currentCameraMovementSpeed;
float t = 0;
float movementTimer = 0;
bool targetReached = false;
float angleDifference = 0;
float positionDifference = 0;
while (!targetReached) {
t += Time.deltaTime / duration;
headTrackTargeTransform.localPosition = Vector3.Lerp (headTrackTargeTransform.localPosition, targetPosition, t);
headTrackTargeTransform.localRotation = Quaternion.Lerp (headTrackTargeTransform.localRotation, targeRotation, t);
angleDifference = Quaternion.Angle (headTrackTargeTransform.localRotation, targeRotation);
positionDifference = GKC_Utils.distance (headTrackTargeTransform.localPosition, targetPosition);
movementTimer += Time.deltaTime;
if ((positionDifference < 0.01f && angleDifference < 0.2f) || movementTimer > (duration + 1)) {
targetReached = true;
}
yield return null;
}
}
}
public void hasSecondMoveCameraToDevice ()
{
secondMoveCameraToDevice = true;
}
public void setCurrentPlayer (GameObject player)
{
currentPlayer = player;
if (currentPlayer != null) {
mainPlayerComponentsManager = currentPlayer.GetComponent<playerComponentsManager> ();
currentPlayerControllerManager = mainPlayerComponentsManager.getPlayerController ();
playerCameraManager = mainPlayerComponentsManager.getPlayerCamera ();
mainCamera = playerCameraManager.getMainCamera ();
usingDevicesManager = mainPlayerComponentsManager.getUsingDevicesSystem ();
headBobManager = mainPlayerComponentsManager.getHeadBob ();
grabObjectsManager = mainPlayerComponentsManager.getGrabObjects ();
weaponsManager = mainPlayerComponentsManager.getPlayerWeaponsManager ();
stepManager = mainPlayerComponentsManager.getFootStepManager ();
headTrackManager = mainPlayerComponentsManager.getHeadTrack ();
pauseManager = mainPlayerComponentsManager.getPauseManager ();
}
}
public void enableFreeInteractionState ()
{
if (carryWeaponOnLowerPositionActive) {
weaponsManager.setCarryWeaponInLowerPositionActiveState (true);
grabObjectsManager.enableOrDisableGeneralCursorFromExternalComponent (false);
}
}
public void disableFreeInteractionState ()
{
if (carryWeaponOnLowerPositionActive) {
weaponsManager.setCarryWeaponInLowerPositionActiveState (false);
grabObjectsManager.enableOrDisableGeneralCursorFromExternalComponent (true);
}
}
public void stopMovement ()
{
if (cameraState != null) {
StopCoroutine (cameraState);
}
deviceEnabled = false;
}
public bool isCameraMoving ()
{
return movingCamera;
}
public void setCurrentPlayerUseDeviceButtonEnabledState (bool state)
{
if (usingDevicesManager != null) {
usingDevicesManager.setUseDeviceButtonEnabledState (state);
}
}
#if UNITY_EDITOR
void OnDrawGizmos ()
{
if (!showGizmo) {
return;
}
if (GKC_Utils.isCurrentSelectionActiveGameObject (gameObject)) {
DrawGizmos ();
}
}
void OnDrawGizmosSelected ()
{
DrawGizmos ();
}
void DrawGizmos ()
{
if (showGizmo) {
if (cameraPosition != null) {
Gizmos.color = Color.yellow;
Gizmos.DrawSphere (cameraPosition.transform.position, gizmoRadius);
Gizmos.color = Color.white;
Gizmos.DrawLine (cameraPosition.transform.position, transform.position);
Gizmos.color = Color.green;
GKC_Utils.drawGizmoArrow (cameraPosition.transform.position, cameraPosition.transform.forward * gizmoArrowLineLength, gizmoArrowColor, gizmoArrowLength, gizmoArrowAngle);
}
}
}
#endif
}