using System.Collections; using System.Collections.Generic; using UnityEngine; public class playerShieldSystem : abilityInfo { [Header ("Custom Settings")] [Space] public bool shieldEnabled; public bool shieldActive; public bool laserActive; public bool laserAbilityEnabled = true; public LayerMask layerToDamage; public bool returnProjectilesDetectedEnabled = true; public bool destroProjectilesStoredIfShieldDisabled; [Space] [Header ("Component Elements")] [Space] public GameObject shield; public armorSurfaceSystem armorSurfaceManager; public GameObject playerLaserGameObject; public laserPlayer laserPlayerManager; public otherPowers mainOtherPowers; public Transform pivotCameraTransform; public Transform playerCameraTransform; public Transform mainCameraTransform; public Collider playerCollider; GameObject currentLaser; Vector3 laserPosition; laserDevice.laserType lasertype; RaycastHit hit; public override void updateAbilityState () { //enable shield when the player touch a laser if (shield.activeSelf && currentLaser != null) { Vector3 targetDir = currentLaser.transform.position - shield.transform.position; Quaternion qTo = Quaternion.LookRotation (targetDir); shield.transform.rotation = Quaternion.Slerp (shield.transform.rotation, qTo, 10 * Time.deltaTime); } //if the shield is enabled, the power decreases if (shield.activeSelf && shieldActive && !laserActive) { //also, rotates the shield towards the camera direction if (pivotCameraTransform.localRotation.x < 0) { shield.transform.rotation = pivotCameraTransform.rotation; } else { shield.transform.rotation = Quaternion.Euler (playerCameraTransform.eulerAngles); } bool updateAbilityEnergyResult = mainPlayerAbilitiesSystem.checkAbilityUseEnergyInUpdate (useEnergyOnAbility, useEnergyWithRate, energyAmountUsed); if (!updateAbilityEnergyResult) { deactivateAbility (); } } if (mainOtherPowers.isAimingPower ()) { //if the player is touching by a laser device, enable the laser in the player if (laserActive && !playerLaserGameObject.activeSelf) { playerLaserGameObject.SetActive (true); } //else disable the laser if (!laserActive && playerLaserGameObject.activeSelf) { playerLaserGameObject.SetActive (false); } } else { if (playerLaserGameObject.activeSelf) { playerLaserGameObject.SetActive (false); } } } //enable and disable the shield when the player want to stop attacks or when he touchs a laser public void setActiveShieldState (bool state) { //enable or disable the shield if (!mainPlayerAbilitiesSystem.isPlayerCurrentlyBusy ()) { setShieldState (state); } } public void setShieldState (bool state) { if (!laserActive && mainPlayerAbilitiesSystem.canMove && shieldEnabled) { shieldActive = state; if (shield.activeSelf != shieldActive) { shield.SetActive (shieldActive); } checkIfDestroyProjectiles (); } } //enable disable the laser in the hand of the player, when he is in the range of one public void activateLaserForceField (Vector3 pos) { if (!laserAbilityEnabled) { return; } if (!isCurrentAbility) { return; } //print ("enable laser force field"); shieldActive = false; laserActive = true; disableAbilityCurrentActiveFromPressState (); if (laserActive) { if (!shield.activeSelf) { shield.SetActive (true); } laserPosition = pos; } if (playerLaserGameObject.activeSelf) { laserPlayerManager.setLaserInfo (lasertype, currentLaser, laserPosition); } checkIfDestroyProjectiles (); } void checkIfDestroyProjectiles () { if (destroProjectilesStoredIfShieldDisabled) { armorSurfaceManager.destroyProjetilesOnShield (); } } public void deactivateLaserForceField () { //print ("disable laser force field"); laserActive = false; if (shield.activeSelf) { shield.SetActive (false); } if (playerLaserGameObject.activeSelf) { playerLaserGameObject.SetActive (false); } laserPlayerManager.removeLaserInfo (); } public void setShieldEnabledState (bool state) { shieldEnabled = state; } //shoot the bullets and missiles catched by the shield public void returnEnemyProjectiles () { //the bullets and missiles from the enemies are stored in the shield, so if the player press the right button of the mouse //the shoots are sent to its owners if they still alive, else, the shoots are launched in the camera direction if (!mainPlayerAbilitiesSystem.isPlayerCurrentlyBusy () && shield.activeSelf && shieldActive && !laserActive) { if (armorSurfaceManager.thereAreProjectilesStored ()) { //check if a raycast hits a surface from the center of the screen to forward //to set the direction of the projectiles in the shield Vector3 direction = mainCameraTransform.TransformDirection (Vector3.forward); bool surfaceFound = false; Vector3 raycastPosition = mainCameraTransform.position; if (Physics.Raycast (raycastPosition, direction, out hit, Mathf.Infinity, layerToDamage)) { if (hit.collider != playerCollider) { surfaceFound = true; } else { raycastPosition = hit.point + direction * 0.2f; if (Physics.Raycast (raycastPosition, direction, out hit, Mathf.Infinity, layerToDamage)) { surfaceFound = true; } } } if (surfaceFound) { direction = hit.point; } armorSurfaceManager.throwProjectilesStored (direction); } } } //get the laser device that touch the player, not enemy lasers, and if the laser reflects in other surfaces or not public void setLaser (GameObject l, laserDevice.laserType type) { currentLaser = l; lasertype = type; } //set the number of refractions in the laser in another function public void setLaserRefractionLimit (int value) { laserPlayerManager.reflactionLimit = value + 1; } public void setLaserAbilityEnabledState (bool state) { laserAbilityEnabled = state; } public override void enableAbility () { shieldEnabled = true; } public override void disableAbility () { shieldEnabled = false; if (shieldActive) { setShieldState (false); } deactivateLaserForceField (); } public override void deactivateAbility () { if (shieldActive) { setShieldState (false); } deactivateLaserForceField (); } public override void activateSecondaryActionOnAbility () { returnEnemyProjectiles (); } public override void useAbilityPressDown () { if (shieldActive) { if (armorSurfaceManager.thereAreProjectilesStored ()) { if (returnProjectilesDetectedEnabled) { returnEnemyProjectiles (); return; } } } setActiveShieldState (!shieldActive); checkUseEventOnUseAbility (); } public override void useAbilityPressHold () { } public override void useAbilityPressUp () { } }