Exemple #1
0
    // -----------------------------------------------------------------------------------
    // UCE_CalculateElementalResistance
    // -----------------------------------------------------------------------------------
    public virtual float UCE_CalculateElementalResistance(UCE_ElementTemplate element, bool bCache = true)
    {
        float            fResistance  = 1.0f;                           // 1.0f = 100% damage by default
        float            fValue       = 0f;
        UCE_ElementCache elementCache = null;

        // -- Check Caching
        if (bCache && _elementsCache.TryGetValue(element.name, out elementCache) && Time.time < elementCache.timer)
        {
            return(elementCache.value);
        }

        // ------------------------------- Calculation -----------------------------------

        // -- Bonus: Base Resistance
        float fBase = fResistance;                                  // 1.0f = 100% damage by default

        foreach (LevelBasedElement ele in elementalResistances)
        {
            if (ele.template == element)
            {
                fBase += ele.Get(level);
            }
        }

        // -- Bonus: Passive Skills
        float fPassiveBonus = (from skill in skills
                               where skill.level > 0 && skill.data is PassiveSkill
                               select((PassiveSkill)skill.data).GetResistance(element, skill.level)).Sum();

        // -- Bonus: Buffs
        float fBuffBonus = buffs.Sum(buff => buff.GetResistance(element));

        fValue = fResistance - (fBase + fPassiveBonus + fBuffBonus);

        // ----------------------------- Calculation End ---------------------------------

        // -- Update Caching
        if (bCache && elementCache != null)
        {
            elementCache.timer           = Time.time + cacheTimerInterval;
            elementCache.value           = fValue;
            _elementsCache[element.name] = elementCache;
        }
        else if (bCache)
        {
            elementCache       = new UCE_ElementCache();
            elementCache.timer = Time.time + cacheTimerInterval;
            elementCache.value = fValue;
            _elementsCache.Add(element.name, elementCache);
        }

        return(fValue);
    }
Exemple #2
0
    // -----------------------------------------------------------------------------------
    // OnDealDamage_UCE_Elements
    // -----------------------------------------------------------------------------------
    public override float UCE_CalculateElementalResistance(UCE_ElementTemplate element, bool bCache = true)
    {
        float            fValue       = 0f;
        UCE_ElementCache elementCache = null;

        // -- Check Caching
        if (_elementsCache != null)
        {
            _elementsCache.TryGetValue(element.name, out elementCache);
        }
        if (bCache && elementCache != null && Time.time < elementCache.timer)
        {
            return(elementCache.value);
        }

        // ------------------------------- Calculation -----------------------------------

        // -- Bonus: Base Resistance
        float fResistance = base.UCE_CalculateElementalResistance(element, false);

        // -- Bonus: Equipment
        float fEquipmentBonus = (from slot in equipment
                                 where slot.amount > 0
                                 select((EquipmentItem)slot.item.data).GetResistance(element)).Sum();

        // -- Bonus: Equipment Sets
        float fSetBonus = 0f;

#if _iMMOTRAITS && _iMMOEQUIPMENTSETS && _iMMOELEMENTS
        // -- Equipment Bonus (Set Bonus)
        foreach (ItemSlot slot in equipment)
        {
            fSetBonus += slot.item.setBonusElementIndividual(slot, equipment, element);
        }

        // -- Equipment Bonus (Set Bonus)
        foreach (ItemSlot slot in equipment)
        {
            float tmpPointsP = slot.item.setBonusElementPartial(slot, equipment, element);
            fSetBonus += tmpPointsP;
            if (tmpPointsP > 0)
            {
                break;
            }
        }

        // -- Equipment Bonus (Set Bonus)
        foreach (ItemSlot slot in equipment)
        {
            float tmpPointsC = slot.item.setBonusElementComplete(slot, equipment, element);
            fSetBonus += tmpPointsC;
            if (tmpPointsC > 0)
            {
                break;
            }
        }
#endif

        // -- Bonus: Traits
        float fTraitBonus = 0f;
#if _iMMOTRAITS && _iMMOELEMENTS
        fTraitBonus = UCE_Traits.Sum(trait => trait.GetResistance(element));
#endif

        fValue = fResistance - (fEquipmentBonus + fTraitBonus + fSetBonus);

        // ----------------------------- Calculation End ---------------------------------

        // -- Update Caching
        if (bCache && elementCache != null)
        {
            elementCache.timer           = Time.time + cacheTimerInterval;
            elementCache.value           = fValue;
            _elementsCache[element.name] = elementCache;
        }
        else if (bCache)
        {
            elementCache       = new UCE_ElementCache();
            elementCache.timer = Time.time + cacheTimerInterval;
            elementCache.value = fValue;
            _elementsCache.Add(element.name, elementCache);
        }

        return(fValue);
    }