예제 #1
0
        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();
            }
        }
예제 #2
0
파일: Item.cs 프로젝트: say1981/Rawr
        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);
        }
예제 #3
0
 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();
     }
 }
예제 #4
0
        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
        }
예제 #5
0
        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
        }
예제 #6
0
        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
        }
예제 #7
0
 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();
     }
 }