/// <summary> /// Listener of Damage Event /// </summary> /// <param name="hitInfo"></param> public virtual void OnDamageHit(VRHitInfo hitInfo) { vDamage damage = new vDamage(hitInfo.attackObject.damage); damage.sender = transform; if (attackName != string.Empty) { damage.attackName = this.attackName; } if (ignoreDefense) { damage.ignoreDefense = ignoreDefense; } /// Calc damage with multiplier /// and Call ApplyDamage of attackObject damage.damageValue *= damageMultiplier > 1 ? damageMultiplier : 1; hitInfo.attackObject.ApplyDamage(hitInfo.hitBox, hitInfo.targetCollider, damage); onDamageHit.Invoke(hitInfo); }
/// <summary> /// Call Back of hitboxes /// </summary> /// <param name="hitBox">vHitBox object</param> /// <param name="other">target Collider</param> public void OnHit(VRHitBox hitBox, Collider other) { if (meleeManager == null) { return; } VRTK_ControllerReference controllerReference = VRTK_ControllerReference.GetControllerReference(meleeManager.GetControllerGameObject(this)); var collisionForce = VRTK_DeviceFinder.GetControllerVelocity(controllerReference).magnitude *powerMult; if (collisionForce < power.x) { return; } float percPowerValue = collisionForce > power.y ? 1 : ((collisionForce - power.x) / (power.y - power.x)); VRTK_ControllerHaptics.TriggerHapticPulse(controllerReference, MaxHapticValue * percPowerValue, 0.03f, 0.01f); //Check first contition for hit if (canApplyDamage && (meleeManager != null && other.gameObject != meleeManager.gameObject)) { var inDamage = false; //check if meleeManager exist and apply his hitProperties to this List <string> _hitDamageTags = meleeManager.hitDamageTags; /// Damage Conditions if (_hitDamageTags == null || _hitDamageTags.Count == 0) { inDamage = true; } else if (_hitDamageTags.Contains(other.tag)) { inDamage = true; } if (inDamage) { VRHitInfo hitInfo = new VRHitInfo(this, hitBox, other, hitBox.transform.position); // Creating new vDamage depending on hit power vDamage oldDamage = new vDamage(hitInfo.attackObject.damage); hitInfo.attackObject.damage.damageValue = Mathf.RoundToInt(hitInfo.attackObject.damage.damageValue * percPowerValue); if (inDamage == true) { /// If meleeManager /// call onDamageHit to control damage values /// and meleemanager will call the ApplyDamage after to filter the damage /// if meleeManager is null /// The damage will be directly applied /// Finally the OnDamageHit event is called if (meleeManager) { meleeManager.OnDamageHit(hitInfo); } else { // Creating new vDamage depending on hit power vDamage newDamage = new vDamage(damage); newDamage.sender = transform; newDamage.damageValue = Mathf.RoundToInt(newDamage.damageValue * percPowerValue); ApplyDamage(hitBox, other, newDamage); } if (onDamageHit != null) { onDamageHit.Invoke(hitInfo); } } hitInfo.attackObject.damage = oldDamage; } } }