public unsafe virtual void AccumulateItemStats(Stats stats, Character character, Item additionalItem) { List <Item> items = new List <Item>(new Item[] { character.Back, character.Chest, character.Feet, character.Finger1, character.Finger2, character.Hands, character.Head, character.Legs, character.Neck, character.Shirt, character.Shoulders, character.Tabard, character.Trinket1, character.Trinket2, character.Waist, character.MainHand, character.Ranged, character.Projectile, character.ProjectileBag, character.Wrist }); if (additionalItem != null) { items.Add(additionalItem); } if (character.MainHand == null || character.MainHand.Slot != Item.ItemSlot.TwoHand) items.Add(character.OffHand); fixed(float *pRawAdditiveData = stats._rawAdditiveData, pRawMultiplicativeData = stats._rawMultiplicativeData, pRawNoStackData = stats._rawNoStackData) { stats.BeginUnsafe(pRawAdditiveData, pRawMultiplicativeData, pRawNoStackData); foreach (Item item in items) { if (item != null) { stats.AccumulateUnsafe(item.GetTotalStats(character)); } } stats.EndUnsafe(); } }
public unsafe Stats GetTotalStats(Character character) { if (cachedTotalStats != null) { return(cachedTotalStats); } bool volatileGem = false, volatileItem = false; Stats totalItemStats = new Stats(); fixed(float *pRawAdditiveData = totalItemStats._rawAdditiveData, pRawMultiplicativeData = totalItemStats._rawMultiplicativeData, pRawNoStackData = totalItemStats._rawNoStackData) { totalItemStats.BeginUnsafe(pRawAdditiveData, pRawMultiplicativeData, pRawNoStackData); totalItemStats.AccumulateUnsafe(this.Stats); bool eligibleForSocketBonus = GemMatchesSlot(Gem1, Sockets.Color1) && GemMatchesSlot(Gem2, Sockets.Color2) && GemMatchesSlot(Gem3, Sockets.Color3); if (Gem1 != null && Gem1.MeetsRequirements(character, out volatileGem)) { totalItemStats.AccumulateUnsafe(Gem1.Stats); } volatileItem = volatileItem || volatileGem; if (Gem2 != null && Gem2.MeetsRequirements(character, out volatileGem)) { totalItemStats.AccumulateUnsafe(Gem2.Stats); } volatileItem = volatileItem || volatileGem; if (Gem3 != null && Gem3.MeetsRequirements(character, out volatileGem)) { totalItemStats.AccumulateUnsafe(Gem3.Stats); } volatileItem = volatileItem || volatileGem; if (eligibleForSocketBonus) { totalItemStats.AccumulateUnsafe(Sockets.Stats); } if (!volatileItem) { cachedTotalStats = totalItemStats; } } return(totalItemStats); }
public unsafe virtual void AccumulateBuffsStats(Stats stats, IEnumerable <Buff> buffs) { fixed(float *pRawAdditiveData = stats._rawAdditiveData, pRawMultiplicativeData = stats._rawMultiplicativeData, pRawNoStackData = stats._rawNoStackData) { stats.BeginUnsafe(pRawAdditiveData, pRawMultiplicativeData, pRawNoStackData); foreach (Buff buff in buffs) { if (buff != null) { stats.AccumulateUnsafe(buff.Stats); } } stats.EndUnsafe(); } }
public unsafe virtual void AccumulateSetBonusStats(Stats stats, Dictionary<string, int> setBonusCount) #endif { #if !SILVERLIGHT fixed (float* pRawAdditiveData = stats._rawAdditiveData, pRawMultiplicativeData = stats._rawMultiplicativeData, pRawNoStackData = stats._rawNoStackData) { stats.BeginUnsafe(pRawAdditiveData, pRawMultiplicativeData, pRawNoStackData); #endif foreach (KeyValuePair<string, int> pair in setBonusCount) { Buff[] setBonuses = Buff.GetSetBonuses(pair.Key); if (setBonuses != null) { foreach (Buff buff in setBonuses) { if (buff != null && pair.Value >= buff.SetThreshold) { stats.AccumulateUnsafe(buff.Stats, true); } } } } #if !SILVERLIGHT stats.EndUnsafe(); } #endif }
public unsafe virtual void AccumulateBuffsStats(Stats stats, List<Buff> buffs) #endif { #if !SILVERLIGHT fixed (float* pRawAdditiveData = stats._rawAdditiveData, pRawMultiplicativeData = stats._rawMultiplicativeData, pRawNoStackData = stats._rawNoStackData) { stats.BeginUnsafe(pRawAdditiveData, pRawMultiplicativeData, pRawNoStackData); #endif foreach (Buff buff in buffs) if (buff != null) { stats.AccumulateUnsafe(buff.Stats, true); } #if !SILVERLIGHT stats.EndUnsafe(); } #endif }
public unsafe virtual void AccumulateItemStats(Stats stats, Character character, Item additionalItem) #endif { #if !SILVERLIGHT fixed (float* pRawAdditiveData = stats._rawAdditiveData, pRawMultiplicativeData = stats._rawMultiplicativeData, pRawNoStackData = stats._rawNoStackData) { stats.BeginUnsafe(pRawAdditiveData, pRawMultiplicativeData, pRawNoStackData); #endif for (int slot = 0; slot < Character.OptimizableSlotCount; slot++) { if (slot != (int)CharacterSlot.OffHand || IncludeOffHandInCalculations(character)) { ItemInstance item = character._item[slot]; if ((object)item != null) { item.AccumulateTotalStats(character, stats); } } } if (additionalItem != null) stats.AccumulateUnsafe(additionalItem.Stats); #if !SILVERLIGHT stats.EndUnsafe(); } #endif }
public unsafe virtual void AccumulateEnchantsStats(Stats stats, Character character) { fixed(float *pRawAdditiveData = stats._rawAdditiveData, pRawMultiplicativeData = stats._rawMultiplicativeData, pRawNoStackData = stats._rawNoStackData) { stats.BeginUnsafe(pRawAdditiveData, pRawMultiplicativeData, pRawNoStackData); stats.AccumulateUnsafe(character.BackEnchant.Stats); stats.AccumulateUnsafe(character.ChestEnchant.Stats); stats.AccumulateUnsafe(character.FeetEnchant.Stats); stats.AccumulateUnsafe(character.Finger1Enchant.Stats); stats.AccumulateUnsafe(character.Finger2Enchant.Stats); stats.AccumulateUnsafe(character.HandsEnchant.Stats); stats.AccumulateUnsafe(character.HeadEnchant.Stats); stats.AccumulateUnsafe(character.LegsEnchant.Stats); stats.AccumulateUnsafe(character.ShouldersEnchant.Stats); if (character.MainHand != null && (character.MainHandEnchant.Slot == Item.ItemSlot.OneHand || (character.MainHandEnchant.Slot == Item.ItemSlot.TwoHand && character.MainHand.Slot == Item.ItemSlot.TwoHand))) { stats.AccumulateUnsafe(character.MainHandEnchant.Stats); } if (character.OffHand != null && (character.MainHand == null || character.MainHand.Slot != Item.ItemSlot.TwoHand) && ( ( character.OffHandEnchant.Slot == Item.ItemSlot.OneHand && (character.OffHand.Slot == Item.ItemSlot.OneHand || character.OffHand.Slot == Item.ItemSlot.OffHand) && character.OffHand.Type != Item.ItemType.None && character.OffHand.Type != Item.ItemType.Shield ) || ( character.OffHandEnchant.Slot == Item.ItemSlot.OffHand && character.OffHand.Slot == Item.ItemSlot.OffHand && character.OffHand.Type == Item.ItemType.Shield ) ) ) { stats.AccumulateUnsafe(character.OffHandEnchant.Stats); } stats.AccumulateUnsafe(character.RangedEnchant.Stats); stats.AccumulateUnsafe(character.WristEnchant.Stats); stats.EndUnsafe(); } }