using UnityEngine; using System.Collections; using System.Collections.Generic; public class damageOrHealTrigger : MonoBehaviour { [Header ("Main Settings")] [Space] public bool useWithPlayer; public bool useWithVehicles; public bool useWithCharacters; public List tagToAffectList = new List (); [Space] [Header ("Damage-Health Settinga")] [Space] public bool addAmountEnabled; public bool removeAmountEnabled; public bool canHeal; public float healRate; public float healtAmount; public bool canRefillEnergy; public float energyRate; public float energyAmount; public bool canRefillFuel; public float fuelRate; public float fuelAmount; [Space] [Header ("Other Settinga")] [Space] public bool ignoreShield; public bool canActivateReactionSystemTemporally; public int damageReactionID = -1; public int damageTypeID = -1; public bool damageCanBeBlocked = true; public bool applyValueAtOnce; [Space] [Header ("Components")] [Space] public GameObject player; public GameObject objectWithHealth; bool objectInside; float lastTime; float valueToAdd; void Update () { //if an object which can be damaged is inside the trigger, then if (objectInside && objectWithHealth) { if (addAmountEnabled) { //if the trigger heals if (canHeal) { if (Time.time > lastTime + healRate) { //while the object is not fully healed, then if (!applyDamage.checkIfMaxHealth (objectWithHealth)) { valueToAdd = healtAmount; if (applyValueAtOnce) { valueToAdd = applyDamage.getMaxHealthAmount (objectWithHealth); } //heal it applyDamage.setHeal (valueToAdd, objectWithHealth); lastTime = Time.time; } else { //else, stop healing it changeTriggerState (false, null, 0); return; } } } if (canRefillFuel) { //if the trigger recharges fuel if (Time.time > lastTime + fuelRate) { //while the vehicle has not the max fuel amount, then if (!applyDamage.checkIfMaxFuel (objectWithHealth)) { valueToAdd = fuelAmount; if (applyValueAtOnce) { valueToAdd = applyDamage.getMaxFuelAmount (objectWithHealth); } //fill it applyDamage.setFuel (valueToAdd, objectWithHealth); lastTime = Time.time; } else { //else, stop refill it changeTriggerState (false, null, 0); return; } } } if (canRefillEnergy) { //if the trigger recharges energy if (Time.time > lastTime + energyRate) { //while the vehicle has not the max fuel amount, then if (!applyDamage.checkIfMaxEnergy (objectWithHealth)) { valueToAdd = energyAmount; if (applyValueAtOnce) { valueToAdd = applyDamage.getMaxEnergyAmount (objectWithHealth); } //fill it applyDamage.setEnergy (valueToAdd, objectWithHealth); lastTime = Time.time; } else { //else, stop refill it changeTriggerState (false, null, 0); return; } } } } if (removeAmountEnabled) { if (canHeal) { //apply damage or heal it accordint to the time rate if (Time.time > lastTime + healRate) { //if the trigger damages valueToAdd = healtAmount; if (applyValueAtOnce) { valueToAdd = applyDamage.getCurrentHealthAmount (objectWithHealth); } //apply damage applyDamage.checkHealth (gameObject, objectWithHealth, valueToAdd, Vector3.zero, objectWithHealth.transform.position + objectWithHealth.transform.up, gameObject, true, true, ignoreShield, false, damageCanBeBlocked, canActivateReactionSystemTemporally, damageReactionID, damageTypeID); lastTime = Time.time; //if the object inside the trigger is dead, stop applying damage if (applyDamage.checkIfDead (objectWithHealth)) { changeTriggerState (false, null, 0); return; } } } if (canRefillFuel) { if (Time.time > lastTime + fuelRate) { //while the vehicle has not the max fuel amount, then if (applyDamage.getCurrentFuelAmount (objectWithHealth) > 0) { valueToAdd = fuelAmount; if (applyValueAtOnce) { valueToAdd = applyDamage.getMaxFuelAmount (objectWithHealth); } //fill it applyDamage.removeFuel (valueToAdd, objectWithHealth); lastTime = Time.time; } else { //else, stop refill it changeTriggerState (false, null, 0); return; } } } if (Time.time > lastTime + energyRate) { if (canRefillEnergy) { //while the vehicle has not the max fuel amount, then if (applyDamage.getCurrentEnergyAmount (objectWithHealth) > 0) { valueToAdd = energyAmount; if (applyValueAtOnce) { valueToAdd = applyDamage.getMaxEnergyAmount (objectWithHealth); } //fill it applyDamage.removeEnergy (valueToAdd, objectWithHealth); lastTime = Time.time; } else { //else, stop refill it changeTriggerState (false, null, 0); return; } } } } } } void OnTriggerEnter (Collider col) { //if the player enters the trigger and it can used with him, then if (col.gameObject.CompareTag ("Player") && useWithPlayer) { player = col.gameObject; //if he is not driving, apply damage or heal if (!player.GetComponent ().driving) { changeTriggerState (true, player, Time.time); } } //else, if a vehicle is inside the trigger and it can be used with vehicles, them else if (isInTagToAffectList (col.gameObject) && col.gameObject.GetComponent () && useWithVehicles) { changeTriggerState (true, col.gameObject, Time.time); } else if (isInTagToAffectList (col.gameObject) && col.gameObject.GetComponent () && useWithCharacters) { changeTriggerState (true, col.gameObject, Time.time); } } void OnTriggerExit (Collider col) { //if the player or a vehicle exits, stop the healing or the damaging if (col.gameObject.CompareTag ("Player") && useWithPlayer) { changeTriggerState (false, null, 0); } else if (isInTagToAffectList (col.gameObject) && col.gameObject.GetComponent () && useWithVehicles) { changeTriggerState (false, null, 0); } else if (isInTagToAffectList (col.gameObject) && col.gameObject.GetComponent () && useWithCharacters) { changeTriggerState (false, null, 0); } } //stop or start the heal or damage action void changeTriggerState (bool inside, GameObject obj, float time) { objectInside = inside; objectWithHealth = obj; lastTime = time; } public bool isInTagToAffectList (GameObject objectToCheck) { if (tagToAffectList.Contains (objectToCheck.tag)) { return true; } return false; } }