Ejemplo n.º 1
0
    /// <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);
    }
Ejemplo n.º 2
0
    /// <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;
            }
        }
    }